{
 "cells": [
  {
   "cell_type": "markdown",
   "source": [
    "# Оглавление\n",
    "* [Описание проекта](#chapter1)\n",
    "* * [Стоимость подержаного автомобиля](#chapter1.1)\n",
    "* * [Основные этапы исследования](#chapter1.2)\n",
    "* [Представление данных](#chapter2)\n",
    "* [Предобработка данных](#chapter3)\n",
    "* [Добавление синтетических данных](#chapter4)\n",
    "* [Подбор и обучение моделей машинного обучения](#chapter5)\n",
    "* * [Разбивка данных на признаки и таргет](#chapter5.1)\n",
    "* * [Кодирование категориальных признаков](#chapter5.2)\n",
    "* * [Нормализация данных](#chapter5.3)\n",
    "* * [Обучение линейных моделей](#chapter5.4)\n",
    "* * [Обучение модели случайного леса](#chapter5.5)\n",
    "* [Выводы](#chapter6)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "# Описание проекта <a name=\"chapter1\"></a>"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## Стоимость поддержанного автомобиля <a name=\"chapter1.1\"></a>"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "Многие знают про маркетплейсы где продаются б/у вещи, на которых есть возможность недорого купить качественную и полезную вещь. Но всегда волнует вопрос - кто и как устанавливает цену, и какие его характеристики больше всего влияют на итоговую стоимость продажи?! Вопрос становится особо актуальным, если речь идет про дорогие товары, например про автомобили! В рамках данной задачи необходимо поработать с данными о продажах автомобилей на вторичном рынке. Целью данного проекта будет разработанная модель предсказания стоимости автомобиля на вторичном рынке."
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## Основные этапы исследования <a name=\"chapter1.2\"></a>"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "- Загрузка и ознакомление с данными, <p>\n",
    "- Предварительная обработка,<p>\n",
    "- Полноценный разведочный анализ,<p>\n",
    "- Разработка новых синтетических признаков,<p>\n",
    "- Проверка на мультиколлинеарность,<p>\n",
    "- Отбор финального набора обучающих признаков,<p>\n",
    "- Выбор и обучение моделей,<p>\n",
    "- Итоговая оценка качества предсказания лучшей модели,<p>\n",
    "- Анализ важности ее признаков."
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "# Представление данных  <a name=\"chapter2\"></a>"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Requirement already satisfied: imblearn in c:\\users\\apmuravev\\appdata\\local\\programs\\python\\python311\\lib\\site-packages (0.0)\n",
      "Requirement already satisfied: imbalanced-learn in c:\\users\\apmuravev\\appdata\\local\\programs\\python\\python311\\lib\\site-packages (from imblearn) (0.10.1)\n",
      "Requirement already satisfied: numpy>=1.17.3 in c:\\users\\apmuravev\\appdata\\local\\programs\\python\\python311\\lib\\site-packages (from imbalanced-learn->imblearn) (1.24.3)\n",
      "Requirement already satisfied: scipy>=1.3.2 in c:\\users\\apmuravev\\appdata\\local\\programs\\python\\python311\\lib\\site-packages (from imbalanced-learn->imblearn) (1.10.1)\n",
      "Requirement already satisfied: scikit-learn>=1.0.2 in c:\\users\\apmuravev\\appdata\\local\\programs\\python\\python311\\lib\\site-packages (from imbalanced-learn->imblearn) (1.2.2)\n",
      "Requirement already satisfied: joblib>=1.1.1 in c:\\users\\apmuravev\\appdata\\local\\programs\\python\\python311\\lib\\site-packages (from imbalanced-learn->imblearn) (1.2.0)\n",
      "Requirement already satisfied: threadpoolctl>=2.0.0 in c:\\users\\apmuravev\\appdata\\local\\programs\\python\\python311\\lib\\site-packages (from imbalanced-learn->imblearn) (3.1.0)\n"
     ]
    }
   ],
   "source": [
    "# Установка необходимых расширений\n",
    "!pip install imblearn"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "outputs": [],
   "source": [
    "# Импорт основных библиотек\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import warnings\n",
    "\n",
    "from pandas.api.types import is_string_dtype\n",
    "\n",
    "from sklearn.ensemble import RandomForestRegressor\n",
    "from sklearn.exceptions import DataConversionWarning\n",
    "from sklearn.model_selection import cross_val_score, KFold, GridSearchCV\n",
    "from sklearn.metrics import mean_absolute_percentage_error\n",
    "from sklearn.preprocessing import StandardScaler, OneHotEncoder, OrdinalEncoder\n",
    "from sklearn.tree import DecisionTreeRegressor\n",
    "\n",
    "from imblearn.pipeline import Pipeline, make_pipeline"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "outputs": [],
   "source": [
    "# Отключение лишних предупреждений\n",
    "warnings.filterwarnings(action='ignore', category=DataConversionWarning)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "outputs": [],
   "source": [
    "# Импорт датасета\n",
    "try:\n",
    "    sample_submission = pd.read_csv('datasets/sample_submission.csv')\n",
    "    test = pd.read_csv('datasets/test.csv')\n",
    "    train = pd.read_csv('datasets/train.csv')\n",
    "except Exception as info:\n",
    "    display(info)\n",
    "    sample_submission = pd.read_csv('/kaggle/input/used-cars-price-prediction-19ds/sample_submission.csv')\n",
    "    test = pd.read_csv('/kaggle/input/used-cars-price-prediction-19ds/test.csv')\n",
    "    train = pd.read_csv('/kaggle/input/used-cars-price-prediction-19ds/train.csv')"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "outputs": [],
   "source": [
    "# Объявим функцию для изучения датасетов\n",
    "def describe_dataframe(dataframe):\n",
    "    display(dataframe.head(10))\n",
    "    display(dataframe.info())\n",
    "    display(dataframe.describe(percentiles=[.5]).T)\n",
    "    print(f\"Количество дублированных строк: {dataframe.duplicated().sum()}\")"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "outputs": [
    {
     "data": {
      "text/plain": "   year     make      model     trim   body transmission                vin  \\\n0  2011     Ford       Edge      SEL    suv    automatic  2fmdk3jc4bba41556   \n1  2014     Ford     Fusion       SE  Sedan    automatic  3fa6p0h75er208976   \n2  2012   Nissan     Sentra   2.0 SL  sedan    automatic  3n1ab6ap4cl698412   \n3  2003   HUMMER         H2     Base    suv    automatic  5grgn23u93h101360   \n4  2007     Ford     Fusion      SEL  Sedan    automatic  3fahp08z17r268380   \n5  2013  Lincoln        MKZ     Base  Sedan    automatic  3ln6l2j91dr817800   \n6  2010  pontiac         g6       4c    NaN    automatic  1g2za5eb4a4157380   \n7  2013     Ford     Escape       SE    SUV    automatic  1fmcu0gx3duc59421   \n8  2000  Hyundai    Elantra      GLS  Sedan    automatic  kmhjf35f2yu955691   \n9  2005     Ford  Freestyle  Limited  wagon    automatic  1fmdk06135ga45438   \n\n  state  condition  odometer   color interior                         seller  \\\n0    md        4.2  111041.0   black    black             santander consumer   \n1    mo        3.5   31034.0   black    black          ars/avis budget group   \n2    nj        2.2   35619.0   black    black             nissan-infiniti lt   \n3    tx        2.8  131301.0    gold    beige     wichita falls ford lin inc   \n4    md        2.0  127709.0   black    black                   purple heart   \n5    mi        2.5   14894.0   black    black  ford motor credit company,llc   \n6    nc        3.4  114587.0  silver    black         north state acceptance   \n7    fl        4.8   26273.0    blue     gray                     fields bmw   \n8    oh        1.9  182624.0   black      tan                   dt inventory   \n9    oh        1.0  149364.0   black      tan    wells fargo dealer services   \n\n   sellingprice                                 saledate  \n0         12500  Tue Jun 02 2015 02:30:00 GMT-0700 (PDT)  \n1         14500  Wed Feb 25 2015 02:00:00 GMT-0800 (PST)  \n2          9100  Wed Jun 10 2015 02:30:00 GMT-0700 (PDT)  \n3         13300  Wed Jun 17 2015 03:00:00 GMT-0700 (PDT)  \n4          1300  Tue Feb 03 2015 04:00:00 GMT-0800 (PST)  \n5         22600  Thu May 21 2015 02:00:00 GMT-0700 (PDT)  \n6          5900  Mon Jan 12 2015 09:30:00 GMT-0800 (PST)  \n7         15200  Tue Feb 03 2015 01:00:00 GMT-0800 (PST)  \n8           700  Thu Jan 22 2015 01:00:00 GMT-0800 (PST)  \n9           325  Tue Jun 16 2015 05:00:00 GMT-0700 (PDT)  ",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>year</th>\n      <th>make</th>\n      <th>model</th>\n      <th>trim</th>\n      <th>body</th>\n      <th>transmission</th>\n      <th>vin</th>\n      <th>state</th>\n      <th>condition</th>\n      <th>odometer</th>\n      <th>color</th>\n      <th>interior</th>\n      <th>seller</th>\n      <th>sellingprice</th>\n      <th>saledate</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>2011</td>\n      <td>Ford</td>\n      <td>Edge</td>\n      <td>SEL</td>\n      <td>suv</td>\n      <td>automatic</td>\n      <td>2fmdk3jc4bba41556</td>\n      <td>md</td>\n      <td>4.2</td>\n      <td>111041.0</td>\n      <td>black</td>\n      <td>black</td>\n      <td>santander consumer</td>\n      <td>12500</td>\n      <td>Tue Jun 02 2015 02:30:00 GMT-0700 (PDT)</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>2014</td>\n      <td>Ford</td>\n      <td>Fusion</td>\n      <td>SE</td>\n      <td>Sedan</td>\n      <td>automatic</td>\n      <td>3fa6p0h75er208976</td>\n      <td>mo</td>\n      <td>3.5</td>\n      <td>31034.0</td>\n      <td>black</td>\n      <td>black</td>\n      <td>ars/avis budget group</td>\n      <td>14500</td>\n      <td>Wed Feb 25 2015 02:00:00 GMT-0800 (PST)</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>2012</td>\n      <td>Nissan</td>\n      <td>Sentra</td>\n      <td>2.0 SL</td>\n      <td>sedan</td>\n      <td>automatic</td>\n      <td>3n1ab6ap4cl698412</td>\n      <td>nj</td>\n      <td>2.2</td>\n      <td>35619.0</td>\n      <td>black</td>\n      <td>black</td>\n      <td>nissan-infiniti lt</td>\n      <td>9100</td>\n      <td>Wed Jun 10 2015 02:30:00 GMT-0700 (PDT)</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>2003</td>\n      <td>HUMMER</td>\n      <td>H2</td>\n      <td>Base</td>\n      <td>suv</td>\n      <td>automatic</td>\n      <td>5grgn23u93h101360</td>\n      <td>tx</td>\n      <td>2.8</td>\n      <td>131301.0</td>\n      <td>gold</td>\n      <td>beige</td>\n      <td>wichita falls ford lin inc</td>\n      <td>13300</td>\n      <td>Wed Jun 17 2015 03:00:00 GMT-0700 (PDT)</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>2007</td>\n      <td>Ford</td>\n      <td>Fusion</td>\n      <td>SEL</td>\n      <td>Sedan</td>\n      <td>automatic</td>\n      <td>3fahp08z17r268380</td>\n      <td>md</td>\n      <td>2.0</td>\n      <td>127709.0</td>\n      <td>black</td>\n      <td>black</td>\n      <td>purple heart</td>\n      <td>1300</td>\n      <td>Tue Feb 03 2015 04:00:00 GMT-0800 (PST)</td>\n    </tr>\n    <tr>\n      <th>5</th>\n      <td>2013</td>\n      <td>Lincoln</td>\n      <td>MKZ</td>\n      <td>Base</td>\n      <td>Sedan</td>\n      <td>automatic</td>\n      <td>3ln6l2j91dr817800</td>\n      <td>mi</td>\n      <td>2.5</td>\n      <td>14894.0</td>\n      <td>black</td>\n      <td>black</td>\n      <td>ford motor credit company,llc</td>\n      <td>22600</td>\n      <td>Thu May 21 2015 02:00:00 GMT-0700 (PDT)</td>\n    </tr>\n    <tr>\n      <th>6</th>\n      <td>2010</td>\n      <td>pontiac</td>\n      <td>g6</td>\n      <td>4c</td>\n      <td>NaN</td>\n      <td>automatic</td>\n      <td>1g2za5eb4a4157380</td>\n      <td>nc</td>\n      <td>3.4</td>\n      <td>114587.0</td>\n      <td>silver</td>\n      <td>black</td>\n      <td>north state acceptance</td>\n      <td>5900</td>\n      <td>Mon Jan 12 2015 09:30:00 GMT-0800 (PST)</td>\n    </tr>\n    <tr>\n      <th>7</th>\n      <td>2013</td>\n      <td>Ford</td>\n      <td>Escape</td>\n      <td>SE</td>\n      <td>SUV</td>\n      <td>automatic</td>\n      <td>1fmcu0gx3duc59421</td>\n      <td>fl</td>\n      <td>4.8</td>\n      <td>26273.0</td>\n      <td>blue</td>\n      <td>gray</td>\n      <td>fields bmw</td>\n      <td>15200</td>\n      <td>Tue Feb 03 2015 01:00:00 GMT-0800 (PST)</td>\n    </tr>\n    <tr>\n      <th>8</th>\n      <td>2000</td>\n      <td>Hyundai</td>\n      <td>Elantra</td>\n      <td>GLS</td>\n      <td>Sedan</td>\n      <td>automatic</td>\n      <td>kmhjf35f2yu955691</td>\n      <td>oh</td>\n      <td>1.9</td>\n      <td>182624.0</td>\n      <td>black</td>\n      <td>tan</td>\n      <td>dt inventory</td>\n      <td>700</td>\n      <td>Thu Jan 22 2015 01:00:00 GMT-0800 (PST)</td>\n    </tr>\n    <tr>\n      <th>9</th>\n      <td>2005</td>\n      <td>Ford</td>\n      <td>Freestyle</td>\n      <td>Limited</td>\n      <td>wagon</td>\n      <td>automatic</td>\n      <td>1fmdk06135ga45438</td>\n      <td>oh</td>\n      <td>1.0</td>\n      <td>149364.0</td>\n      <td>black</td>\n      <td>tan</td>\n      <td>wells fargo dealer services</td>\n      <td>325</td>\n      <td>Tue Jun 16 2015 05:00:00 GMT-0700 (PDT)</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 440236 entries, 0 to 440235\n",
      "Data columns (total 15 columns):\n",
      " #   Column        Non-Null Count   Dtype  \n",
      "---  ------        --------------   -----  \n",
      " 0   year          440236 non-null  int64  \n",
      " 1   make          432193 non-null  object \n",
      " 2   model         432113 non-null  object \n",
      " 3   trim          431899 non-null  object \n",
      " 4   body          429843 non-null  object \n",
      " 5   transmission  388775 non-null  object \n",
      " 6   vin           440236 non-null  object \n",
      " 7   state         440236 non-null  object \n",
      " 8   condition     430831 non-null  float64\n",
      " 9   odometer      440167 non-null  float64\n",
      " 10  color         439650 non-null  object \n",
      " 11  interior      439650 non-null  object \n",
      " 12  seller        440236 non-null  object \n",
      " 13  sellingprice  440236 non-null  int64  \n",
      " 14  saledate      440236 non-null  object \n",
      "dtypes: float64(2), int64(2), object(11)\n",
      "memory usage: 50.4+ MB\n"
     ]
    },
    {
     "data": {
      "text/plain": "None"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": "                 count          mean           std     min      50%       max\nyear          440236.0   2010.040101      3.977945  1982.0   2012.0    2015.0\ncondition     430831.0      3.425077      0.949973     1.0      3.6       5.0\nodometer      440167.0  68344.421604  53542.203908     1.0  52098.0  999999.0\nsellingprice  440236.0  13592.209588   9751.479098     1.0  12100.0  230000.0",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>count</th>\n      <th>mean</th>\n      <th>std</th>\n      <th>min</th>\n      <th>50%</th>\n      <th>max</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>year</th>\n      <td>440236.0</td>\n      <td>2010.040101</td>\n      <td>3.977945</td>\n      <td>1982.0</td>\n      <td>2012.0</td>\n      <td>2015.0</td>\n    </tr>\n    <tr>\n      <th>condition</th>\n      <td>430831.0</td>\n      <td>3.425077</td>\n      <td>0.949973</td>\n      <td>1.0</td>\n      <td>3.6</td>\n      <td>5.0</td>\n    </tr>\n    <tr>\n      <th>odometer</th>\n      <td>440167.0</td>\n      <td>68344.421604</td>\n      <td>53542.203908</td>\n      <td>1.0</td>\n      <td>52098.0</td>\n      <td>999999.0</td>\n    </tr>\n    <tr>\n      <th>sellingprice</th>\n      <td>440236.0</td>\n      <td>13592.209588</td>\n      <td>9751.479098</td>\n      <td>1.0</td>\n      <td>12100.0</td>\n      <td>230000.0</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Количество дублированных строк: 0\n"
     ]
    }
   ],
   "source": [
    "describe_dataframe(train)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "outputs": [
    {
     "data": {
      "text/plain": "   year        make         model      trim      body transmission  \\\n0  2005    Cadillac           CTS      Base     Sedan    automatic   \n1  2014         GMC  Savana Cargo      2500       Van          NaN   \n2  2013      Nissan        Murano         S       SUV    automatic   \n3  2013   Chevrolet        Impala  LS Fleet     Sedan    automatic   \n4  2013      Nissan         Titan        SV  Crew Cab    automatic   \n5  2003  Volkswagen        Passat  GLS 1.8T     wagon    automatic   \n6  2013     Hyundai        Sonata       GLS     Sedan    automatic   \n7  2013        Ford      Explorer      Base       SUV    automatic   \n8  2011    Infiniti       G Sedan      G37x   G Sedan    automatic   \n9  2007   Chevrolet      Suburban   1500 LS       SUV    automatic   \n\n                 vin state  condition  odometer   color interior  \\\n0  1g6dp567450124779    ca        2.7  116970.0  silver    black   \n1  1gtw7fca7e1902207    pa        4.4    6286.0   white     gray   \n2  jn8az1mw6dw303497    oh        4.6   11831.0    gray    black   \n3  2g1wf5e34d1160703    fl        2.3   57105.0  silver    black   \n4  1n6aa0ec3dn301209    tn        2.9   31083.0   black    black   \n5  wvwvd63b93e175638    nc        2.4  104155.0  silver    black   \n6  5npeb4ac4dh809686    il        3.7   30669.0  silver     gray   \n7  1fm5k7b97dgb16454    nc        3.2   87862.0   black     gray   \n8  jn1cv6ar5bm411441    tn        3.5   47028.0   black    beige   \n9  3gnfc16j77g158033    ga        3.4  191211.0   black      tan   \n\n                                             seller  \\\n0                            lexus of stevens creek   \n1                                            u-haul   \n2                                nissan-infiniti lt   \n3  onemain rem/auto club of miami inc dba north dad   \n4                         nissan north america inc.   \n5              fred anderson nissan of fayetteville   \n6                                 merchants leasing   \n7             ge fleet services for itself/servicer   \n8                                nissan infiniti lt   \n9                           riverside chevrolet inc   \n\n                                  saledate  \n0  Wed Jan 14 2015 04:30:00 GMT-0800 (PST)  \n1  Fri Feb 27 2015 01:00:00 GMT-0800 (PST)  \n2  Tue Feb 24 2015 01:30:00 GMT-0800 (PST)  \n3  Fri Mar 06 2015 02:00:00 GMT-0800 (PST)  \n4  Wed Jun 03 2015 03:30:00 GMT-0700 (PDT)  \n5  Tue Jun 09 2015 03:00:00 GMT-0700 (PDT)  \n6  Tue Mar 03 2015 02:00:00 GMT-0800 (PST)  \n7  Tue Feb 10 2015 01:15:00 GMT-0800 (PST)  \n8  Wed Feb 04 2015 02:30:00 GMT-0800 (PST)  \n9  Tue Feb 10 2015 04:30:00 GMT-0800 (PST)  ",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>year</th>\n      <th>make</th>\n      <th>model</th>\n      <th>trim</th>\n      <th>body</th>\n      <th>transmission</th>\n      <th>vin</th>\n      <th>state</th>\n      <th>condition</th>\n      <th>odometer</th>\n      <th>color</th>\n      <th>interior</th>\n      <th>seller</th>\n      <th>saledate</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>2005</td>\n      <td>Cadillac</td>\n      <td>CTS</td>\n      <td>Base</td>\n      <td>Sedan</td>\n      <td>automatic</td>\n      <td>1g6dp567450124779</td>\n      <td>ca</td>\n      <td>2.7</td>\n      <td>116970.0</td>\n      <td>silver</td>\n      <td>black</td>\n      <td>lexus of stevens creek</td>\n      <td>Wed Jan 14 2015 04:30:00 GMT-0800 (PST)</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>2014</td>\n      <td>GMC</td>\n      <td>Savana Cargo</td>\n      <td>2500</td>\n      <td>Van</td>\n      <td>NaN</td>\n      <td>1gtw7fca7e1902207</td>\n      <td>pa</td>\n      <td>4.4</td>\n      <td>6286.0</td>\n      <td>white</td>\n      <td>gray</td>\n      <td>u-haul</td>\n      <td>Fri Feb 27 2015 01:00:00 GMT-0800 (PST)</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>2013</td>\n      <td>Nissan</td>\n      <td>Murano</td>\n      <td>S</td>\n      <td>SUV</td>\n      <td>automatic</td>\n      <td>jn8az1mw6dw303497</td>\n      <td>oh</td>\n      <td>4.6</td>\n      <td>11831.0</td>\n      <td>gray</td>\n      <td>black</td>\n      <td>nissan-infiniti lt</td>\n      <td>Tue Feb 24 2015 01:30:00 GMT-0800 (PST)</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>2013</td>\n      <td>Chevrolet</td>\n      <td>Impala</td>\n      <td>LS Fleet</td>\n      <td>Sedan</td>\n      <td>automatic</td>\n      <td>2g1wf5e34d1160703</td>\n      <td>fl</td>\n      <td>2.3</td>\n      <td>57105.0</td>\n      <td>silver</td>\n      <td>black</td>\n      <td>onemain rem/auto club of miami inc dba north dad</td>\n      <td>Fri Mar 06 2015 02:00:00 GMT-0800 (PST)</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>2013</td>\n      <td>Nissan</td>\n      <td>Titan</td>\n      <td>SV</td>\n      <td>Crew Cab</td>\n      <td>automatic</td>\n      <td>1n6aa0ec3dn301209</td>\n      <td>tn</td>\n      <td>2.9</td>\n      <td>31083.0</td>\n      <td>black</td>\n      <td>black</td>\n      <td>nissan north america inc.</td>\n      <td>Wed Jun 03 2015 03:30:00 GMT-0700 (PDT)</td>\n    </tr>\n    <tr>\n      <th>5</th>\n      <td>2003</td>\n      <td>Volkswagen</td>\n      <td>Passat</td>\n      <td>GLS 1.8T</td>\n      <td>wagon</td>\n      <td>automatic</td>\n      <td>wvwvd63b93e175638</td>\n      <td>nc</td>\n      <td>2.4</td>\n      <td>104155.0</td>\n      <td>silver</td>\n      <td>black</td>\n      <td>fred anderson nissan of fayetteville</td>\n      <td>Tue Jun 09 2015 03:00:00 GMT-0700 (PDT)</td>\n    </tr>\n    <tr>\n      <th>6</th>\n      <td>2013</td>\n      <td>Hyundai</td>\n      <td>Sonata</td>\n      <td>GLS</td>\n      <td>Sedan</td>\n      <td>automatic</td>\n      <td>5npeb4ac4dh809686</td>\n      <td>il</td>\n      <td>3.7</td>\n      <td>30669.0</td>\n      <td>silver</td>\n      <td>gray</td>\n      <td>merchants leasing</td>\n      <td>Tue Mar 03 2015 02:00:00 GMT-0800 (PST)</td>\n    </tr>\n    <tr>\n      <th>7</th>\n      <td>2013</td>\n      <td>Ford</td>\n      <td>Explorer</td>\n      <td>Base</td>\n      <td>SUV</td>\n      <td>automatic</td>\n      <td>1fm5k7b97dgb16454</td>\n      <td>nc</td>\n      <td>3.2</td>\n      <td>87862.0</td>\n      <td>black</td>\n      <td>gray</td>\n      <td>ge fleet services for itself/servicer</td>\n      <td>Tue Feb 10 2015 01:15:00 GMT-0800 (PST)</td>\n    </tr>\n    <tr>\n      <th>8</th>\n      <td>2011</td>\n      <td>Infiniti</td>\n      <td>G Sedan</td>\n      <td>G37x</td>\n      <td>G Sedan</td>\n      <td>automatic</td>\n      <td>jn1cv6ar5bm411441</td>\n      <td>tn</td>\n      <td>3.5</td>\n      <td>47028.0</td>\n      <td>black</td>\n      <td>beige</td>\n      <td>nissan infiniti lt</td>\n      <td>Wed Feb 04 2015 02:30:00 GMT-0800 (PST)</td>\n    </tr>\n    <tr>\n      <th>9</th>\n      <td>2007</td>\n      <td>Chevrolet</td>\n      <td>Suburban</td>\n      <td>1500 LS</td>\n      <td>SUV</td>\n      <td>automatic</td>\n      <td>3gnfc16j77g158033</td>\n      <td>ga</td>\n      <td>3.4</td>\n      <td>191211.0</td>\n      <td>black</td>\n      <td>tan</td>\n      <td>riverside chevrolet inc</td>\n      <td>Tue Feb 10 2015 04:30:00 GMT-0800 (PST)</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 110058 entries, 0 to 110057\n",
      "Data columns (total 14 columns):\n",
      " #   Column        Non-Null Count   Dtype  \n",
      "---  ------        --------------   -----  \n",
      " 0   year          110058 non-null  int64  \n",
      " 1   make          107997 non-null  object \n",
      " 2   model         107979 non-null  object \n",
      " 3   trim          107944 non-null  object \n",
      " 4   body          107464 non-null  object \n",
      " 5   transmission  97047 non-null   object \n",
      " 6   vin           110058 non-null  object \n",
      " 7   state         110058 non-null  object \n",
      " 8   condition     107679 non-null  float64\n",
      " 9   odometer      110039 non-null  float64\n",
      " 10  color         109900 non-null  object \n",
      " 11  interior      109900 non-null  object \n",
      " 12  seller        110058 non-null  object \n",
      " 13  saledate      110058 non-null  object \n",
      "dtypes: float64(2), int64(1), object(11)\n",
      "memory usage: 11.8+ MB\n"
     ]
    },
    {
     "data": {
      "text/plain": "None"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": "              count          mean           std     min      50%       max\nyear       110058.0   2010.060005      3.960190  1982.0   2012.0    2015.0\ncondition  107679.0      3.423222      0.951301     1.0      3.6       5.0\nodometer   110039.0  68074.331601  53520.988173     1.0  51922.0  999999.0",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>count</th>\n      <th>mean</th>\n      <th>std</th>\n      <th>min</th>\n      <th>50%</th>\n      <th>max</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>year</th>\n      <td>110058.0</td>\n      <td>2010.060005</td>\n      <td>3.960190</td>\n      <td>1982.0</td>\n      <td>2012.0</td>\n      <td>2015.0</td>\n    </tr>\n    <tr>\n      <th>condition</th>\n      <td>107679.0</td>\n      <td>3.423222</td>\n      <td>0.951301</td>\n      <td>1.0</td>\n      <td>3.6</td>\n      <td>5.0</td>\n    </tr>\n    <tr>\n      <th>odometer</th>\n      <td>110039.0</td>\n      <td>68074.331601</td>\n      <td>53520.988173</td>\n      <td>1.0</td>\n      <td>51922.0</td>\n      <td>999999.0</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Количество дублированных строк: 0\n"
     ]
    }
   ],
   "source": [
    "describe_dataframe(test)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "outputs": [
    {
     "data": {
      "text/plain": "<pandas.io.formats.style.Styler at 0x260ec1407d0>",
      "text/html": "<style type=\"text/css\">\n#T_f165d_row0_col0, #T_f165d_row1_col1, #T_f165d_row2_col2, #T_f165d_row3_col3 {\n  background-color: #b40426;\n  color: #f1f1f1;\n}\n#T_f165d_row0_col1, #T_f165d_row1_col3 {\n  background-color: #f7a98b;\n  color: #000000;\n}\n#T_f165d_row0_col2, #T_f165d_row2_col0, #T_f165d_row2_col1, #T_f165d_row2_col3 {\n  background-color: #3b4cc0;\n  color: #f1f1f1;\n}\n#T_f165d_row0_col3 {\n  background-color: #f59d7e;\n  color: #000000;\n}\n#T_f165d_row1_col0 {\n  background-color: #f49a7b;\n  color: #000000;\n}\n#T_f165d_row1_col2 {\n  background-color: #6384eb;\n  color: #f1f1f1;\n}\n#T_f165d_row3_col0 {\n  background-color: #f29274;\n  color: #f1f1f1;\n}\n#T_f165d_row3_col1 {\n  background-color: #f7ac8e;\n  color: #000000;\n}\n#T_f165d_row3_col2 {\n  background-color: #5b7ae5;\n  color: #f1f1f1;\n}\n</style>\n<table id=\"T_f165d\">\n  <thead>\n    <tr>\n      <th class=\"blank level0\" >&nbsp;</th>\n      <th id=\"T_f165d_level0_col0\" class=\"col_heading level0 col0\" >year</th>\n      <th id=\"T_f165d_level0_col1\" class=\"col_heading level0 col1\" >condition</th>\n      <th id=\"T_f165d_level0_col2\" class=\"col_heading level0 col2\" >odometer</th>\n      <th id=\"T_f165d_level0_col3\" class=\"col_heading level0 col3\" >sellingprice</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th id=\"T_f165d_level0_row0\" class=\"row_heading level0 row0\" >year</th>\n      <td id=\"T_f165d_row0_col0\" class=\"data row0 col0\" >1.000000</td>\n      <td id=\"T_f165d_row0_col1\" class=\"data row0 col1\" >0.553403</td>\n      <td id=\"T_f165d_row0_col2\" class=\"data row0 col2\" >-0.774498</td>\n      <td id=\"T_f165d_row0_col3\" class=\"data row0 col3\" >0.586847</td>\n    </tr>\n    <tr>\n      <th id=\"T_f165d_level0_row1\" class=\"row_heading level0 row1\" >condition</th>\n      <td id=\"T_f165d_row1_col0\" class=\"data row1 col0\" >0.553403</td>\n      <td id=\"T_f165d_row1_col1\" class=\"data row1 col1\" >1.000000</td>\n      <td id=\"T_f165d_row1_col2\" class=\"data row1 col2\" >-0.540544</td>\n      <td id=\"T_f165d_row1_col3\" class=\"data row1 col3\" >0.538906</td>\n    </tr>\n    <tr>\n      <th id=\"T_f165d_level0_row2\" class=\"row_heading level0 row2\" >odometer</th>\n      <td id=\"T_f165d_row2_col0\" class=\"data row2 col0\" >-0.774498</td>\n      <td id=\"T_f165d_row2_col1\" class=\"data row2 col1\" >-0.540544</td>\n      <td id=\"T_f165d_row2_col2\" class=\"data row2 col2\" >1.000000</td>\n      <td id=\"T_f165d_row2_col3\" class=\"data row2 col3\" >-0.583044</td>\n    </tr>\n    <tr>\n      <th id=\"T_f165d_level0_row3\" class=\"row_heading level0 row3\" >sellingprice</th>\n      <td id=\"T_f165d_row3_col0\" class=\"data row3 col0\" >0.586847</td>\n      <td id=\"T_f165d_row3_col1\" class=\"data row3 col1\" >0.538906</td>\n      <td id=\"T_f165d_row3_col2\" class=\"data row3 col2\" >-0.583044</td>\n      <td id=\"T_f165d_row3_col3\" class=\"data row3 col3\" >1.000000</td>\n    </tr>\n  </tbody>\n</table>\n"
     },
     "execution_count": 151,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Рассмотрим корреляции численных данных\n",
    "corr = train[['year', 'condition', 'odometer', 'sellingprice']].corr()\n",
    "corr.style.background_gradient(cmap='coolwarm')"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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pCiK0t6DICLyJPfffz8OHz6Mb7/9FsDZzNPixYtx8OBB/OEPf8D48ePxxBNP2K7/5JNP8Nhjj+HkyZPC1/vf//1f3HfffSgpKQFwNlM1bdo05OTkYNCgQa7/QETkFgyqiIjOkZ2djeHDh+PIkSO44IILMHDgQNx88814+umnERUVhcrKSnh7e9uub2pqQm1tLaqqqhAUFIQffvgB8+fPx2+//QaLxYLGxka7/qVLl+Lee+9FbW0tTCZTO35SIjKST3sPgIjI0wwZMgSDBg3CsmXLMGHCBOzZswerV68GAFRWVuLZZ5/FDTfc4HBfQEAADh8+jKuvvhozZ87ECy+8gIiICPz000+YPn066uvrERQUBAAIDAxkQEXUyTCoIiISuPvuu/H666/jxIkTSEtLQ3x8PABg6NChyM3NRXJysvC+7du3o7m5GQsWLICX19llq1988YXbxk1E7YdBFRGRwK233oq5c+fi3XffxbJly2zt8+bNw9VXX40ePXrgpptugpeXF3799Vfs3r0bzz//PJKTk9HQ0IBFixbhmmuuwaZNm7BkyZJ2/CRE5C7c/UdEJBAaGoobb7wRISEhSE9Pt7VPnDgR33zzDb7//nsMHz4cI0eOxMKFC5GQkAAAGDRoEF577TW8/PLLGDBgAJYvX4758+e306cgInfiQnUiIhXjx49H//798eabb7b3UIioA2BQRUR0jrKyMmzYsAE33XQT9u7di969e7f3kIioA+CaKiKicwwZMgRlZWV4+eWXGVARkdOYqSIiIiIyABeqExERERmAQRURERGRARhUERERERmAQRURERGRARhUERERERmAQRURERGRARhUERERERmAQRURERGRAf4/HMc0raPz0j8AAAAASUVORK5CYII=\n"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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EBcXh0GDBrn6qK/h7OO8RkREBEaOHKnp09LSgtWrV7v6GBkLERERdWJtkzfv25w5c5T4+Hhl7dq1yrFjx1wftbW1rj6/+tWvlF69eilffvmlsm3bNiU3N1fJzc11tTc1NSkXXHCBMmXKFKWwsFBZuXKlkpycrDz00EOuPsXFxUpMTIxy//33K3v27FEWL16shIaGKitXrnT1effdd5XIyEhl2bJlynfffafccccdSkJCgmZXoWgsItz9R0REFHyMvn+3a1AFwOfH66+/7upTV1en/PrXv1YSExOVmJgY5Wc/+5ly7NgxzXUOHDigXHHFFUp0dLSSlJSk3HvvvUpjY6Omz5o1a5Rhw4YpERERSlZWlubfcFq0aJHSq1cvJSIiQhk9erSyadMmTbuRsehhUEVERBR8jL5/OxRFUdprlqyzqaqqQnx8PCorKxEXF9fewyEiIiIDjL5/22b3HxEREVEwY1BFREREZAIGVUREREQmYFBFREREZAIGVUREREQmYFBFREREZAIGVUREREQmYFBFREREZAIGVUREREQmYFBFREREZAIGVUREREQmYFBFREREZAIGVUREREQmYFBFREREZIKw9h4AERER2UtxeTUOnqpFn+5dkJnUpb2HEzQYVBEREREAoKK2AXe9U4h1e8tdj43rn4xFM4YjPia8HUcWHLj8R0RERACAu94pxPp9JzSPrd93Ane+s6OdRhRcGFQRERERisursW5vOZoVRfN4s6Jg3d5ylJyoaaeRBQ8GVURERISDp2p12w+cZFAlwqCKiIiI0LtbjG57n+5MWBdhUEVERETISo7FuP7JCHU4NI+HOhwY1z+ZuwANYFBFREREAIBFM4ZjbL8kzWNj+yVh0Yzh7TSi4MKSCkRERAQAiI8Jx5uzR6PkRA0OnKxhnSpJDKqIiIhIIzOJwVQguPxHREREZAIGVUREREQmYFBFREREZAIGVUREREQmYKI6ERGRpOLyahw8VcvdcaTBoIqIiMigitoG3PVOIdbtLXc9Nq5/MhbNGI74mPB2HBnZAZf/iIiIDLrrnUKs33dC89j6fSdw5zs7/H5PcXk11hSV8UDiToAzVURERAYUl1drZqicmhUF6/aWo+REjWYpkLNanQ9nqoiIiAw4eKpWt/3ASe1MVCCzWhTcGFQREREZ0LtbjG57n+7uWSrnrFazomj6qGe1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a5dy9913KyEhIcoXX3zRXrega86cOUp8fLyydu1a5dixY66P2tpaV59Zs2YpDz74oOvr9evXK2FhYcozzzyj7NmzR3n00UeV8PBwZdeuXe1xC0KB3OPvf/975bPPPlP279+vbN++XbnhhhuUqKgoZffu3e1xC7oefPBBJT8/XykpKVF27typPPjgg4rD4VA+//xzRVGC//WTvb9geu388dwZF+yvoS+iewym1/Hee+9V1q5dq5SUlCjr169XJk+erCQlJSllZWWKotjn9WNQFQScJQQ8P26++WZFURTl5ptvVsaPH+/1PcOGDVMiIiKUrKws5fXXX2/zcRsle39//vOflb59+ypRUVFKt27dlAkTJihffvll+wzeAF/3BkDzmowfP951v07vv/++cv755ysRERHK4MGDlU8++aRtBy4hkHucP3++0qtXLyUiIkJJTU1VrrzySqWgoKDtB2/ArbfeqvTu3VuJiIhQkpOTlUmTJrkCDkUJ/tdP9v6C6bXzxzPgCPbX0BfRPQbT63j99dcrPXr0UCIiIpTzzjtPuf7665V9+/a52u3y+jkURVGsnQsjIiIi6viYU0VERERkAgZVRERERCZgUEVERERkAgZVRERERCZgUEVERERkAgZVRERERCZgUEVERERkAgZVRERERCZgUEVEZII+ffrg+eefd33tcDiwYsUK3e/55S9/iby8PEvHRURtJ6y9B0BE1BEdO3YMiYmJAIADBw4gMzMTO3bswLBhw1x9XnjhBfBQC6KOg0EVEZEF0tLShH3i4+PbYCRE1Fa4/EdEHU5LSwuefvpp9OvXD5GRkejVqxeeeOIJAMCuXbtw2WWXITo6Gt27d8cdd9yB6upq1/c6l+SeeeYZ9OjRA927d8fcuXPR2Njo6lNWVoaf/vSniI6ORmZmJpYvX+41BvXyX2ZmJgBg+PDhcDgcmDBhgubfcqqvr8ddd92FlJQUREVF4ZJLLsHWrVtd7WvXroXD4cDq1atx0UUXISYmBmPGjEFRUZFZTx0RtQKDKiLqcB566CE89dRT+N3vfofvvvsOb7/9NlJTU1FTU4OpU6ciMTERW7duxQcffIAvvvgC8+bN03z/mjVrsH//fqxZswZvvPEGli1bhmXLlrnaf/nLX+Lw4cNYs2YN/vnPf+Kvf/0rysrK/I5ny5YtAIAvvvgCx44dw7///W+f/R544AH861//whtvvIGCggL069cPU6dOxalTpzT9Hn74YTz77LPYtm0bwsLCcOuttwb4TBGRqRQiog6kqqpKiYyMVF599VWvtr/97W9KYmKiUl1d7Xrsk08+UUJCQpTS0lJFURTl5ptvVnr37q00NTW5+lx33XXK9ddfryiKohQVFSkAlC1btrja9+zZowBQFi5c6HoMgPLhhx8qiqIoJSUlCgBlx44dmvHcfPPNyvTp0xVFUZTq6molPDxcWb58uau9oaFBSU9PV55++mlFURRlzZo1CgDliy++0IwfgFJXVyfxLBGRFThTRUQdyp49e1BfX49Jkyb5bBs6dCi6dOniemzs2LFoaWnRLKENHjwYoaGhrq979Ojhmonas2cPwsLCMHLkSFf7gAEDkJCQ0Kpx79+/H42NjRg7dqzrsfDwcIwePRp79uzR9B0yZIhmbAB0Z8qIqG0wqCKiDiU6OrrV1wgPD9d87XA40NLS0urrmkU9PofDAQC2Gh9RZ8Wgiog6lP79+yM6OhqrV6/2ahs4cCC++eYb1NTUuB5bv349QkJCkJ2dbej6AwYMQFNTE7Zv3+56rKioCBUVFX6/JyIiAgDQ3Nzst0/fvn0RERGB9evXux5rbGzE1q1bMWjQIENjI6L2xZIKRNShREVF4be//S0eeOABREREYOzYsSgvL8fu3bsxc+ZMPProo7j55pvx2GOPoby8HHfeeSdmzZqF1NRUQ9fPzs7G5Zdfjv/+7//Gyy+/jLCwMMyfP193hiwlJQXR0dFYuXIlevbsiaioKK9yCl26dMGcOXNw//33o1u3bujVqxeefvpp1NbWYvbs2a16ToiobXCmiog6nN/97ne49957sWDBAgwcOBDXX389ysrKEBMTg88++wynTp3CqFGj8POf/xyTJk3CSy+9JHX9119/Henp6Rg/fjyuueYa3HHHHUhJSfHbPywsDC+++CJeeeUVpKenY/r06T77PfXUU7j22msxa9YsjBgxAvv27cNnn33mKiJKRPbmUBSW8yUiIiJqLc5UEREREZmAQRURERGRCRhUEREREZmAQRURERGRCRhUEREREZmAQRURERGRCRhUEREREZmAQRURERGRCRhUEREREZmAQRURERGRCRhUEREREZng/wMKHTbgmB49EwAAAABJRU5ErkJggg==\n"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "for idx, feature in enumerate(train[['year', 'condition', 'odometer']]):\n",
    "    train.plot(feature, \"sellingprice\", subplots=True, kind=\"scatter\")"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "Выводы: При знакомстве с данными были выявлены следующие особенности: В данных большое количество выбросов, пропущенных значений, неявных дубликатов в колонках с марками и моделями авто. В предобрабоке необходимо будет отсечь выбивающиеся значения и восстановить пропуски. Те строки, в которых данные восстановить невозможно - будут удалены, для уменьшения количества шумов в данных. Также числовые значения уже до кодирования категориальных переменных показывают, что данных мультиколлинеарным и линейные модели, скорее всего не подойдут для решения данной задачи."
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "# Предобработка данных <a name=\"chapter3\"></a>"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "В процессе предобработки необходимо добиться следующих целей:\n",
    "1) Выявить и устранить выбросы в колонках 'odometer' и 'sellingprice'\n",
    "2) Привести колонку с датой продажи к виду datetime\n",
    "3) С помощью группировок восполнить недостающие данные в категориальных ячейках\n",
    "4) Если недостающие значение осталось - заменим его на other или unknown\n",
    "5) Если недостающих значений слишком много - удалим строки полностю\n",
    "6) Постараемся сохранить более 90% данных"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "outputs": [],
   "source": [
    "# Сохраним первоначальные датафреймы для сравнения чистых и обработанных данных\n",
    "raw_train = train.copy(deep=True)\n",
    "raw_test = test.copy(deep=True)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "outputs": [
    {
     "data": {
      "text/plain": "0.01      3269.66\n0.99    226987.68\nName: odometer, dtype: float64"
     },
     "execution_count": 154,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Определим крайние 2% значений одометра и будем считать, что это выбросы в данных\n",
    "train['odometer'].quantile([0.01, 0.99])"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "outputs": [],
   "source": [
    "# Удалим выбивающиеся значения из пробега и цены\n",
    "train.drop(train.query(\"odometer > 227000 or odometer < 3270\").index, inplace=True)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 156,
   "outputs": [],
   "source": [
    "# Чтобы также сгладить предсказания теста - уберём выбивающиеся значения\n",
    "# test.loc[test['odometer'] > 227000, 'odometer'] = 227000\n",
    "# test.loc[test['odometer'] < 3270, 'odometer'] = 3270"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 157,
   "outputs": [
    {
     "data": {
      "text/plain": "0.015      700.0\n0.985    40500.0\nName: sellingprice, dtype: float64"
     },
     "execution_count": 157,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Определим крайние 3% значений цены авто и будем считать, что это выбросы в данных\n",
    "train['sellingprice'].quantile([0.015, 0.985])"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 158,
   "outputs": [],
   "source": [
    "train.drop(train.query(\"sellingprice > 40500 or sellingprice < 700\").index, inplace=True)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 159,
   "outputs": [
    {
     "data": {
      "text/plain": "year                0\nmake             7063\nmodel            7073\ntrim             7332\nbody             9095\ntransmission    48517\nvin                 0\nstate               0\ncondition        8510\nodometer           45\ncolor             476\ninterior          476\nseller              0\nsellingprice        0\nsaledate            0\ndtype: int64"
     },
     "execution_count": 159,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Все пропущенные значения на экране\n",
    "train.isna().sum()"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 160,
   "outputs": [],
   "source": [
    "# Преобразуем колонку с датой продажи к формату datetime\n",
    "train['sellingprice'] = np.floor(pd.to_numeric(train['sellingprice'], errors='coerce')).astype('Int32')\n",
    "train['condition'] = np.floor(pd.to_numeric(train['condition'], errors='coerce')).astype('Float64')\n",
    "\n",
    "test['condition'] = np.floor(pd.to_numeric(test['condition'], errors='coerce')).astype('Float64')\n",
    "\n",
    "train['saledate'] = pd.to_datetime(train['saledate'].str[:-15], format=\"%a %b %d %Y %H:%M:%S\")\n",
    "test['saledate'] = pd.to_datetime(test['saledate'].str[:-15], format=\"%a %b %d %Y %H:%M:%S\")"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 161,
   "outputs": [
    {
     "data": {
      "text/plain": "'Первоначальное число уникальных марок автомобилей: 54'"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": "Ford             71390\nChevrolet        45417\nNissan           41825\nToyota           30446\nDodge            23530\nHonda            20584\nHyundai          16627\nBmw              14521\nKia              13978\nChrysler         13279\nMercedes-benz    12119\nInfiniti         11837\nJeep             11727\nVolkswagen        9606\nLexus             8909\nGmc               7896\nMazda             6475\nCadillac          5543\nAcura             4507\nLincoln           4327\nAudi              4197\nSubaru            3906\nBuick             3744\nRam               3275\nPontiac           3248\nMitsubishi        3217\nVolvo             2772\nMini              2437\nSaturn            1944\nMercury           1362\nScion             1320\nLand rover        1091\nJaguar             936\nSuzuki             794\nFiat               638\nHummer             591\nPorsche            540\nSaab               351\nSmart              287\nOldsmobile         163\nIsuzu              120\nMercedes            58\nMaserati            54\nLandrover           19\nVw                  16\nPlymouth            11\nGmc truck           10\nBentley              4\nMercedes-b           2\nGeo                  2\nFord truck           1\nAston martin         1\nMazda tk             1\nFisker               1\nName: make, dtype: int64"
     },
     "execution_count": 161,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Изучим марки автомобилей\n",
    "train['make'] = train['make'].str.capitalize()\n",
    "display(f\"Первоначальное число уникальных марок автомобилей: {train['make'].value_counts().count()}\")\n",
    "train['make'].value_counts()"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 162,
   "outputs": [],
   "source": [
    "# Напишем функцию для поиска и замены неявных дубликатов в марке авто\n",
    "def make_unique(data):\n",
    "    if not data or data in ['none', 'nan']:\n",
    "        return 'Other'\n",
    "    data = str(data)\n",
    "    if data.find(\"ford\") != -1:\n",
    "        return \"ford\"\n",
    "    elif data.find(\"gmc\") != -1:\n",
    "        return \"gmc\"\n",
    "    elif data.find(\"land\") != -1 and data.find(\"rover\") != -1:\n",
    "        return \"landrover\"\n",
    "    elif data.find(\"mercedes\") != -1:\n",
    "        return \"mercedes\"\n",
    "    elif data == \"vw\":\n",
    "        return \"volkswagen\"\n",
    "    elif data.find(\"dodge\") != -1:\n",
    "        return \"dodge\"\n",
    "    elif data.find(\"mazda\") != -1:  #  Hyundai\n",
    "        return \"mazda\"\n",
    "    elif data.find(\"hyundai\") != -1:\n",
    "        return \"hyundai\"\n",
    "    else:\n",
    "        return data"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 163,
   "outputs": [],
   "source": [
    "# Напишем функцию для поиска и замены неявных дубликатов в модели авто\n",
    "def body_unique(data):\n",
    "    if not data or data in ['none', 'nan']:\n",
    "        return 'Other'\n",
    "    data = str(data)\n",
    "    if data.find(\"cab\") != -1 or data.find(\"crew\") != -1:\n",
    "        return \"pick-up\"\n",
    "    if data.find(\"convertible\") != -1:\n",
    "        return \"convertible\"\n",
    "    if data.find(\"coupe\") != -1 or data.find(\"koup\") != -1:\n",
    "        return \"coupe\"\n",
    "    if data.find(\"wagon\") != -1:\n",
    "        return \"wagon\"\n",
    "    if data.find(\"van\") != -1:\n",
    "        return \"van\"\n",
    "    if data.find(\"sedan\") != -1:\n",
    "        return \"sedan\"\n",
    "    else:\n",
    "        return data"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 164,
   "outputs": [
    {
     "data": {
      "text/plain": "Ford            71391\nChevrolet       45417\nNissan          41825\nToyota          30446\nDodge           23530\nHonda           20584\nHyundai         16627\nBmw             14521\nKia             13978\nChrysler        13279\nMercedes        12179\nInfiniti        11837\nJeep            11727\nVolkswagen       9622\nLexus            8909\nGmc              7906\nNan              7063\nMazda            6476\nCadillac         5543\nAcura            4507\nLincoln          4327\nAudi             4197\nSubaru           3906\nBuick            3744\nRam              3275\nPontiac          3248\nMitsubishi       3217\nVolvo            2772\nMini             2437\nSaturn           1944\nMercury          1362\nScion            1320\nLandrover        1110\nJaguar            936\nSuzuki            794\nFiat              638\nHummer            591\nPorsche           540\nSaab              351\nSmart             287\nOldsmobile        163\nIsuzu             120\nMaserati           54\nPlymouth           11\nBentley             4\nGeo                 2\nAston martin        1\nFisker              1\nName: make, dtype: int64"
     },
     "execution_count": 164,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Устраняем неявные дубликаты марок авто в трейне\n",
    "train['make'] = train['make'].str.lower().apply(make_unique).str.capitalize()\n",
    "train['make'].value_counts()"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 165,
   "outputs": [
    {
     "data": {
      "text/plain": "        year make model trim body transmission                vin state  \\\n10      2007  NaN   NaN  NaN  NaN    automatic  5tfbv54157x019560    ca   \n42      2007  NaN   NaN  NaN  NaN       manual  jm1bk34l671745431    md   \n63      2011  NaN   NaN  NaN  NaN    automatic  1fdne1bw5bda64735    ga   \n64      2008  NaN   NaN  NaN  NaN    automatic  1gbdv13wx8d142776    ca   \n111     2006  NaN   NaN  NaN  NaN    automatic  3gnda13d36s611801    nv   \n...      ...  ...   ...  ...  ...          ...                ...   ...   \n440085  2011  NaN   NaN  NaN  NaN    automatic  1fdne1bw8bdb21610    az   \n440114  2011  NaN   NaN  NaN  NaN    automatic  2lnbl8ev9bx757689    nj   \n440118  2004  NaN   NaN  NaN  NaN    automatic  1gyde637240130408    md   \n440122  2007  NaN   NaN  NaN  NaN    automatic  salme15487a251642    ca   \n440144  2004  NaN   NaN  NaN  NaN    automatic  2c4gm68474r511987    oh   \n\n        condition  odometer   color interior  \\\n10            3.0  102507.0    blue     gray   \n42            2.0   92656.0    blue     gray   \n63            5.0   67159.0   white     gray   \n64            4.0  113582.0   white     gray   \n111           2.0  129019.0  orange     gray   \n...           ...       ...     ...      ...   \n440085        3.0   80594.0   white     gray   \n440114        3.0  134164.0       —    black   \n440118        3.0  123123.0   white    beige   \n440122        2.0   39545.0   black    black   \n440144        3.0  124679.0    gold    beige   \n\n                                       seller  sellingprice  \\\n10                        aaero sweet company         17250   \n42      credit acceptance corp/vrs/southfield          5600   \n63                                  vpsi, inc         13200   \n64                  wholesale motor sales inc          4100   \n111     credit acceptance corp/vrs/southfield          2900   \n...                                       ...           ...   \n440085            mike albert fleet solutions         11100   \n440114             merchants automotive group         11800   \n440118  credit acceptance corp/vrs/southfield          3400   \n440122                        hornburg jaguar         17750   \n440144  credit acceptance corp/vrs/southfield          3200   \n\n                  saledate  \n10     2015-01-29 03:30:00  \n42     2015-06-16 02:30:00  \n63     2015-06-04 03:00:00  \n64     2015-02-05 04:00:00  \n111    2015-02-05 04:00:00  \n...                    ...  \n440085 2015-02-04 03:00:00  \n440114 2015-03-04 01:30:00  \n440118 2015-02-17 01:30:00  \n440122 2015-06-17 05:15:00  \n440144 2015-02-17 04:00:00  \n\n[7063 rows x 15 columns]",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>year</th>\n      <th>make</th>\n      <th>model</th>\n      <th>trim</th>\n      <th>body</th>\n      <th>transmission</th>\n      <th>vin</th>\n      <th>state</th>\n      <th>condition</th>\n      <th>odometer</th>\n      <th>color</th>\n      <th>interior</th>\n      <th>seller</th>\n      <th>sellingprice</th>\n      <th>saledate</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>10</th>\n      <td>2007</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>automatic</td>\n      <td>5tfbv54157x019560</td>\n      <td>ca</td>\n      <td>3.0</td>\n      <td>102507.0</td>\n      <td>blue</td>\n      <td>gray</td>\n      <td>aaero sweet company</td>\n      <td>17250</td>\n      <td>2015-01-29 03:30:00</td>\n    </tr>\n    <tr>\n      <th>42</th>\n      <td>2007</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>manual</td>\n      <td>jm1bk34l671745431</td>\n      <td>md</td>\n      <td>2.0</td>\n      <td>92656.0</td>\n      <td>blue</td>\n      <td>gray</td>\n      <td>credit acceptance corp/vrs/southfield</td>\n      <td>5600</td>\n      <td>2015-06-16 02:30:00</td>\n    </tr>\n    <tr>\n      <th>63</th>\n      <td>2011</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>automatic</td>\n      <td>1fdne1bw5bda64735</td>\n      <td>ga</td>\n      <td>5.0</td>\n      <td>67159.0</td>\n      <td>white</td>\n      <td>gray</td>\n      <td>vpsi, inc</td>\n      <td>13200</td>\n      <td>2015-06-04 03:00:00</td>\n    </tr>\n    <tr>\n      <th>64</th>\n      <td>2008</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>automatic</td>\n      <td>1gbdv13wx8d142776</td>\n      <td>ca</td>\n      <td>4.0</td>\n      <td>113582.0</td>\n      <td>white</td>\n      <td>gray</td>\n      <td>wholesale motor sales inc</td>\n      <td>4100</td>\n      <td>2015-02-05 04:00:00</td>\n    </tr>\n    <tr>\n      <th>111</th>\n      <td>2006</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>automatic</td>\n      <td>3gnda13d36s611801</td>\n      <td>nv</td>\n      <td>2.0</td>\n      <td>129019.0</td>\n      <td>orange</td>\n      <td>gray</td>\n      <td>credit acceptance corp/vrs/southfield</td>\n      <td>2900</td>\n      <td>2015-02-05 04:00:00</td>\n    </tr>\n    <tr>\n      <th>...</th>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n    </tr>\n    <tr>\n      <th>440085</th>\n      <td>2011</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>automatic</td>\n      <td>1fdne1bw8bdb21610</td>\n      <td>az</td>\n      <td>3.0</td>\n      <td>80594.0</td>\n      <td>white</td>\n      <td>gray</td>\n      <td>mike albert fleet solutions</td>\n      <td>11100</td>\n      <td>2015-02-04 03:00:00</td>\n    </tr>\n    <tr>\n      <th>440114</th>\n      <td>2011</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>automatic</td>\n      <td>2lnbl8ev9bx757689</td>\n      <td>nj</td>\n      <td>3.0</td>\n      <td>134164.0</td>\n      <td>—</td>\n      <td>black</td>\n      <td>merchants automotive group</td>\n      <td>11800</td>\n      <td>2015-03-04 01:30:00</td>\n    </tr>\n    <tr>\n      <th>440118</th>\n      <td>2004</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>automatic</td>\n      <td>1gyde637240130408</td>\n      <td>md</td>\n      <td>3.0</td>\n      <td>123123.0</td>\n      <td>white</td>\n      <td>beige</td>\n      <td>credit acceptance corp/vrs/southfield</td>\n      <td>3400</td>\n      <td>2015-02-17 01:30:00</td>\n    </tr>\n    <tr>\n      <th>440122</th>\n      <td>2007</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>automatic</td>\n      <td>salme15487a251642</td>\n      <td>ca</td>\n      <td>2.0</td>\n      <td>39545.0</td>\n      <td>black</td>\n      <td>black</td>\n      <td>hornburg jaguar</td>\n      <td>17750</td>\n      <td>2015-06-17 05:15:00</td>\n    </tr>\n    <tr>\n      <th>440144</th>\n      <td>2004</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>automatic</td>\n      <td>2c4gm68474r511987</td>\n      <td>oh</td>\n      <td>3.0</td>\n      <td>124679.0</td>\n      <td>gold</td>\n      <td>beige</td>\n      <td>credit acceptance corp/vrs/southfield</td>\n      <td>3200</td>\n      <td>2015-02-17 04:00:00</td>\n    </tr>\n  </tbody>\n</table>\n<p>7063 rows × 15 columns</p>\n</div>"
     },
     "execution_count": 165,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Находим пустые значения марок авто\n",
    "train.loc[train['make'] == 'Nan', 'make'] = np.nan\n",
    "train[train.make.isna()]"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 166,
   "outputs": [],
   "source": [
    "# Т.к все эти 7063 значений пустые - они создатут лишний шум в предсказаниях - удалим их\n",
    "train.dropna(subset=['make', 'model'], inplace=True)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 167,
   "outputs": [
    {
     "data": {
      "text/plain": "Ford            18466\nChevrolet       11801\nNissan          10485\nToyota           7728\nDodge            6188\nHonda            5382\nHyundai          4410\nBmw              4136\nKia              3571\nMercedes         3471\nChrysler         3459\nJeep             3069\nInfiniti         3002\nVolkswagen       2515\nLexus            2430\nNan              2061\nGmc              2059\nMazda            1676\nCadillac         1496\nLincoln          1153\nAcura            1151\nAudi             1124\nBuick            1019\nSubaru           1015\nRam               889\nPontiac           866\nMitsubishi        806\nVolvo             765\nMini              674\nSaturn            544\nMercury           434\nLandrover         371\nScion             318\nJaguar            297\nPorsche           280\nSuzuki            222\nFiat              181\nHummer            174\nSaab               93\nOldsmobile         88\nSmart              81\nIsuzu              38\nBentley            23\nMaserati           21\nTesla               6\nPlymouth            4\nGeo                 3\nRolls-royce         3\nAston martin        2\nDaewoo              2\nFerrari             2\nFisker              2\nLotus               1\nChev truck          1\nName: make, dtype: int64"
     },
     "execution_count": 167,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Устраняем неявные дубликаты марок авто в тесте\n",
    "test['make'] = test['make'].str.lower().apply(make_unique).str.capitalize()\n",
    "test['make'].value_counts()"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 168,
   "outputs": [
    {
     "data": {
      "text/plain": "Sedan          188143\nSuv            108002\nPick-up         35205\nVan             24096\nHatchback       20015\nCoupe           14331\nWagon           12192\nConvertible      7630\nOther            2032\nName: body, dtype: int64"
     },
     "execution_count": 168,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Устраняем неявные дубликаты моделей авто в трейне\n",
    "train.loc[train['body'] == 'Nan', 'body'] = np.nan\n",
    "train['body'] = train['body'].str.lower().apply(body_unique).str.capitalize()\n",
    "train['body'] = train['body'].str.lower().apply(body_unique).str.capitalize()\n",
    "train['body'].value_counts()"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 169,
   "outputs": [
    {
     "data": {
      "text/plain": "Sedan          48970\nSuv            28295\nPick-up         9202\nVan             6414\nHatchback       5152\nCoupe           3995\nWagon           3287\nOther           2594\nConvertible     2149\nName: body, dtype: int64"
     },
     "execution_count": 169,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Устраняем неявные дубликаты моделей авто в тесте\n",
    "test['body'] = test['body'].str.lower().apply(body_unique).str.capitalize()\n",
    "test['body'] = test['body'].str.lower().apply(body_unique).str.capitalize()\n",
    "test['body'].value_counts()"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 170,
   "outputs": [
    {
     "data": {
      "text/plain": "Altima       15156\nF-150        10996\nFusion       10178\nCamry         9636\nEscape        9358\n             ...  \n42c              1\nGla-class        1\nSwift            1\n420-class        1\nG500             1\nName: model, Length: 780, dtype: int64"
     },
     "execution_count": 170,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Для упрощения исследования данных заменим оставшиеся значения на unknown\n",
    "train['model'] = train['model'].str.capitalize()\n",
    "train['model'].fillna(\"Unknown\", inplace=True)\n",
    "train['model'].value_counts()"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 171,
   "outputs": [
    {
     "data": {
      "text/plain": "Altima           3736\nF-150            2737\nFusion           2553\nCamry            2423\nEscape           2296\n                 ... \nExige               1\n1                   1\nC240w               1\nAccord hybrid       1\nCaprice             1\nName: model, Length: 747, dtype: int64"
     },
     "execution_count": 171,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Для упрощения исследования данных заменим оставшиеся значения на unknown\n",
    "test['model'] = test['model'].str.capitalize()\n",
    "test['model'].fillna(\"Unknown\", inplace=True)\n",
    "test['model'].value_counts()"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 172,
   "outputs": [
    {
     "data": {
      "text/plain": "Base                40852\nSe                  33548\nLx                  15772\nLimited             14111\nLt                  12946\n                    ...  \n4x2 ex xl               1\n4x2 v8 xlt              1\n10th anniversary        1\nSe premium              1\n4x4 v6 xlt sport        1\nName: trim, Length: 1719, dtype: int64"
     },
     "execution_count": 172,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train['trim'] = train['trim'].str.capitalize()\n",
    "train['trim'].fillna(\"Unknown\", inplace=True)\n",
    "train['trim'].value_counts()"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 173,
   "outputs": [
    {
     "data": {
      "text/plain": "Base                11009\nSe                   8725\nLx                   4098\nLimited              3536\nLt                   3280\n                    ...  \n4wd s                   1\nHx                      1\nGr tr gr touring        1\nMr touring              1\nAwd xs ll bean          1\nName: trim, Length: 1458, dtype: int64"
     },
     "execution_count": 173,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test['trim'] = test['trim'].str.capitalize()\n",
    "test['trim'].fillna(\"Unknown\", inplace=True)\n",
    "test['trim'].value_counts()"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 174,
   "outputs": [
    {
     "data": {
      "text/plain": "automatic    352103\nmanual        12263\nName: transmission, dtype: int64"
     },
     "execution_count": 174,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train['transmission'].value_counts()"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 175,
   "outputs": [
    {
     "data": {
      "text/plain": "automatic    390857\nmanual        14376\nUnknown        6413\nName: transmission, dtype: int64"
     },
     "execution_count": 175,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# В трансмиссии слишком много пропущенных значений, поэтому постараемся с помощью группировки значенией найти утраченные данные. Оставшиеся заменим на Unknown\n",
    "train['transmission'].fillna(\n",
    "    train.groupby(['make', 'model'])['transmission'].transform(\n",
    "        lambda x: x.fillna(x.iloc[round(len(x) / 2)])\n",
    "    ),\n",
    "    inplace=True\n",
    ")  # Думаю, что это можно удалить\n",
    "train['transmission'].fillna(\"Unknown\", inplace=True)\n",
    "train['transmission'].value_counts()"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 176,
   "outputs": [
    {
     "data": {
      "text/plain": "automatic    93584\nmanual        3463\nName: transmission, dtype: int64"
     },
     "execution_count": 176,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test['transmission'].value_counts()"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 177,
   "outputs": [
    {
     "data": {
      "text/plain": "automatic    105196\nmanual         3867\nUnknown         995\nName: transmission, dtype: int64"
     },
     "execution_count": 177,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#  Повторим процедуру для теста, но на основании данных ТРЕЙНА\n",
    "test['transmission'].fillna(\n",
    "    train.groupby(['make', 'model'])['transmission'].transform(\n",
    "        lambda x: x.fillna(x.iloc[round(len(x) / 2)])\n",
    "    ),\n",
    "    inplace=True\n",
    ")\n",
    "test['transmission'].fillna(\"Unknown\", inplace=True)\n",
    "test['transmission'].value_counts()"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 178,
   "outputs": [
    {
     "data": {
      "text/plain": "black        81395\nwhite        78034\ngray         62250\nsilver       61948\nblue         37675\nred          32300\n—            19075\ngold          7973\ngreen         7662\nburgundy      6603\nbeige         6573\nbrown         4994\norange        1505\npurple        1126\noff-white     1091\nyellow         868\ncharcoal       366\nturquoise      166\npink            28\nlime            14\nName: color, dtype: int64"
     },
     "execution_count": 178,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#  Пропущенные значения в цвете заменим на прочерк - он мало влияет на цену авто\n",
    "train['color'].fillna(\"—\", inplace=True)\n",
    "train['color'].value_counts()"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 179,
   "outputs": [
    {
     "data": {
      "text/plain": "black        22006\nwhite        20928\nsilver       16360\ngray         16348\nblue         10180\nred           8384\n—             5106\ngreen         2270\ngold          2207\nbeige         1826\nburgundy      1759\nbrown         1300\norange         407\npurple         284\noff-white      275\nyellow         274\ncharcoal        84\nturquoise       49\npink            10\nlime             1\nName: color, dtype: int64"
     },
     "execution_count": 179,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test['color'].fillna(\"—\", inplace=True)\n",
    "test['color'].value_counts()"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 180,
   "outputs": [
    {
     "data": {
      "text/plain": "black        182809\ngray         131234\nbeige         43706\ntan           31878\n—             12253\nbrown          5995\nred             892\nsilver          798\nblue            646\noff-white       358\npurple          240\ngold            234\nwhite           195\ngreen           172\nburgundy        130\norange           93\nyellow           13\nName: interior, dtype: int64"
     },
     "execution_count": 180,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#  Пропущенные значения в интерьере заменим на прочерк - он мало влияет на цену авто\n",
    "train['interior'].fillna(\"—\", inplace=True)\n",
    "train['interior'].value_counts()"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 181,
   "outputs": [
    {
     "data": {
      "text/plain": "black        48176\ngray         34984\nbeige        11931\ntan           8658\n—             3538\nbrown         1664\nred            264\nblue           241\nsilver         225\noff-white      107\ngold            64\npurple          58\ngreen           44\nburgundy        34\norange          33\nwhite           33\nyellow           4\nName: interior, dtype: int64"
     },
     "execution_count": 181,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test['interior'].fillna(\"—\", inplace=True)\n",
    "test['interior'].value_counts()"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 182,
   "outputs": [
    {
     "data": {
      "text/plain": "4.0    135095\n3.0    135008\n2.0    100262\n1.0     33950\n5.0      7164\n2.5        90\n1.5        63\n3.5        14\nName: condition, dtype: Int64"
     },
     "execution_count": 182,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#  Постараемся максимально точно оценить состояние авто, т.к. от него зависит большая часть ценв автомобиля\n",
    "train['condition'].fillna(train.groupby(['make', 'body', 'trim', 'model'])['condition'].transform('median'), inplace=True)\n",
    "train['condition'].fillna(train.groupby(['make'])['condition'].transform('median'), inplace=True)\n",
    "train['condition'] = np.round(train['condition'], decimals = 1)\n",
    "train['condition'].value_counts()"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 183,
   "outputs": [],
   "source": [
    "test['condition'].fillna(train.groupby(['make', 'body', 'trim', 'model'])['condition'].transform('median'), inplace=True)\n",
    "test['condition'].fillna(train.groupby(['make'])['condition'].transform('median'), inplace=True)\n",
    "test['condition'].fillna(train['condition'].median(), inplace=True)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 184,
   "outputs": [
    {
     "data": {
      "text/plain": "4.0    35805\n3.0    35337\n2.0    26526\n1.0    10153\n5.0     2218\n2.5        9\n3.5        7\n1.5        3\nName: condition, dtype: Int64"
     },
     "execution_count": 184,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test['condition'].value_counts()"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 185,
   "outputs": [],
   "source": [
    "#  Показания одометра не менее важны, чем состояние автомобиля\n",
    "train['odometer'].fillna(train.groupby(['make', 'body', 'model'])['odometer'].transform('mean'), inplace=True)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 186,
   "outputs": [],
   "source": [
    "test['odometer'].fillna(train.groupby(['make', 'body', 'model'])['odometer'].transform('mean'), inplace=True)\n",
    "test['odometer'].fillna(train['odometer'].mean(), inplace=True)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 187,
   "outputs": [
    {
     "data": {
      "text/plain": "year            0\nmake            0\nmodel           0\ntrim            0\nbody            0\ntransmission    0\nvin             0\nstate           0\ncondition       0\nodometer        0\ncolor           0\ninterior        0\nseller          0\nsellingprice    0\nsaledate        0\ndtype: int64"
     },
     "execution_count": 187,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.isna().sum()"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 188,
   "outputs": [
    {
     "data": {
      "text/plain": "year            0\nmake            0\nmodel           0\ntrim            0\nbody            0\ntransmission    0\nvin             0\nstate           0\ncondition       0\nodometer        0\ncolor           0\ninterior        0\nseller          0\nsaledate        0\ndtype: int64"
     },
     "execution_count": 188,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test.isna().sum()"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 189,
   "outputs": [
    {
     "data": {
      "text/plain": "'Общие потери данных в процентах: 6.49424399640193%'"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#  Посчитаем итоговую потерю в данных, оно не должно составить более 10% от общего значения\n",
    "train_losses = abs(train.shape[0] - raw_train.shape[0]) / raw_train.shape[0] * 100\n",
    "display(f\"Общие потери данных в процентах: {train_losses}%\")"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "Выводы: В итоге предобработки данных были устранены все пропущенные значения, явные выбросы и форматы некоторых колонок. Итоговая потеря данных составила около 7%, что не повредит дальнейшей работе."
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "# Добавление синтетических данных <a name=\"chapter4\"></a>"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "В исходном датафреме есть колонка - saledate, которая сама по себе не несёт полезной информации для модели. Однако, её можно разбить на такие составляющие как:\n",
    "1) Год продажи\n",
    "2) Месяц продажи\n",
    "3) День недели продажи\n",
    "Также исходя из этой даты можно высчитать суммарный возраст автомобиля.\n",
    "После преобразований данную колонку стоит удалить за ненадобностью. Колонки VIN и SELLER также подлежат удалению."
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 190,
   "outputs": [],
   "source": [
    "#  Добавим колонки, связанные с датой продажи\n",
    "train['saledate_week_day'] = train['saledate'].dt.weekday\n",
    "train['saledate_month'] = train['saledate'].dt.month\n",
    "train['saledate_year'] = train['saledate'].dt.year\n",
    "train['car_age'] = train['saledate'].dt.year - train['year']"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 191,
   "outputs": [],
   "source": [
    "# Проявились стодцы с отрицательным возрастом - заменим возраст на нулевой и уменьшим год создания авто.\n",
    "# train.loc[train[\"car_age\"] < 0, \"year\"] -= int(train[\"car_age\"])\n",
    "train.loc[train[\"car_age\"] < 0, \"car_age\"] = 0"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 192,
   "outputs": [],
   "source": [
    "test['saledate_week_day'] = test['saledate'].dt.weekday\n",
    "test['saledate_month'] = test['saledate'].dt.month\n",
    "test['saledate_year'] = test['saledate'].dt.year\n",
    "test['car_age'] = test['saledate'].dt.year - test['year']"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 193,
   "outputs": [],
   "source": [
    "train.drop(columns=[\n",
    "    'vin',\n",
    "    'seller',\n",
    "    'saledate'\n",
    "], inplace=True)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 194,
   "outputs": [],
   "source": [
    "test.drop(columns=[\n",
    "    'vin',\n",
    "    'seller',\n",
    "    'saledate'\n",
    "], inplace=True)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 195,
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\APMuravev\\AppData\\Local\\Temp\\ipykernel_47984\\1228014876.py:2: FutureWarning: The default value of numeric_only in DataFrame.corr is deprecated. In a future version, it will default to False. Select only valid columns or specify the value of numeric_only to silence this warning.\n",
      "  corr = train.corr()\n"
     ]
    },
    {
     "data": {
      "text/plain": "<pandas.io.formats.style.Styler at 0x260ea9af010>",
      "text/html": "<style type=\"text/css\">\n#T_4d79f_row0_col0, #T_4d79f_row1_col1, #T_4d79f_row2_col2, #T_4d79f_row3_col3, #T_4d79f_row4_col4, #T_4d79f_row5_col5, #T_4d79f_row6_col6, #T_4d79f_row7_col7 {\n  background-color: #b40426;\n  color: #f1f1f1;\n}\n#T_4d79f_row0_col1 {\n  background-color: #f7b497;\n  color: #000000;\n}\n#T_4d79f_row0_col2, #T_4d79f_row0_col7, #T_4d79f_row2_col1, #T_4d79f_row2_col3, #T_4d79f_row2_col4, #T_4d79f_row5_col6, #T_4d79f_row6_col5, #T_4d79f_row7_col0 {\n  background-color: #3b4cc0;\n  color: #f1f1f1;\n}\n#T_4d79f_row0_col3 {\n  background-color: #f29072;\n  color: #f1f1f1;\n}\n#T_4d79f_row0_col4, #T_4d79f_row1_col4, #T_4d79f_row2_col0 {\n  background-color: #5977e3;\n  color: #f1f1f1;\n}\n#T_4d79f_row0_col5 {\n  background-color: #c7d7f0;\n  color: #000000;\n}\n#T_4d79f_row0_col6, #T_4d79f_row4_col0 {\n  background-color: #e1dad6;\n  color: #000000;\n}\n#T_4d79f_row1_col0 {\n  background-color: #f39778;\n  color: #000000;\n}\n#T_4d79f_row1_col2 {\n  background-color: #6b8df0;\n  color: #f1f1f1;\n}\n#T_4d79f_row1_col3 {\n  background-color: #f7a688;\n  color: #000000;\n}\n#T_4d79f_row1_col5, #T_4d79f_row3_col5 {\n  background-color: #c9d7f0;\n  color: #000000;\n}\n#T_4d79f_row1_col6, #T_4d79f_row4_col7 {\n  background-color: #d8dce2;\n  color: #000000;\n}\n#T_4d79f_row1_col7 {\n  background-color: #8badfd;\n  color: #000000;\n}\n#T_4d79f_row2_col5, #T_4d79f_row6_col7 {\n  background-color: #d7dce3;\n  color: #000000;\n}\n#T_4d79f_row2_col6 {\n  background-color: #c0d4f5;\n  color: #000000;\n}\n#T_4d79f_row2_col7 {\n  background-color: #d75445;\n  color: #f1f1f1;\n}\n#T_4d79f_row3_col0 {\n  background-color: #ec7f63;\n  color: #f1f1f1;\n}\n#T_4d79f_row3_col1 {\n  background-color: #f7af91;\n  color: #000000;\n}\n#T_4d79f_row3_col2 {\n  background-color: #5572df;\n  color: #f1f1f1;\n}\n#T_4d79f_row3_col4 {\n  background-color: #6788ee;\n  color: #f1f1f1;\n}\n#T_4d79f_row3_col6 {\n  background-color: #dcdddd;\n  color: #000000;\n}\n#T_4d79f_row3_col7 {\n  background-color: #779af7;\n  color: #f1f1f1;\n}\n#T_4d79f_row4_col1 {\n  background-color: #b6cefa;\n  color: #000000;\n}\n#T_4d79f_row4_col2 {\n  background-color: #c3d5f4;\n  color: #000000;\n}\n#T_4d79f_row4_col3 {\n  background-color: #ccd9ed;\n  color: #000000;\n}\n#T_4d79f_row4_col5 {\n  background-color: #cedaeb;\n  color: #000000;\n}\n#T_4d79f_row4_col6, #T_4d79f_row5_col2 {\n  background-color: #d5dbe5;\n  color: #000000;\n}\n#T_4d79f_row5_col0 {\n  background-color: #d6dce4;\n  color: #000000;\n}\n#T_4d79f_row5_col1 {\n  background-color: #a3c2fe;\n  color: #000000;\n}\n#T_4d79f_row5_col3 {\n  background-color: #b3cdfb;\n  color: #000000;\n}\n#T_4d79f_row5_col4 {\n  background-color: #4a63d3;\n  color: #f1f1f1;\n}\n#T_4d79f_row5_col7 {\n  background-color: #dadce0;\n  color: #000000;\n}\n#T_4d79f_row6_col0 {\n  background-color: #ebd3c6;\n  color: #000000;\n}\n#T_4d79f_row6_col1 {\n  background-color: #bad0f8;\n  color: #000000;\n}\n#T_4d79f_row6_col2 {\n  background-color: #bed2f6;\n  color: #000000;\n}\n#T_4d79f_row6_col3, #T_4d79f_row7_col5 {\n  background-color: #cdd9ec;\n  color: #000000;\n}\n#T_4d79f_row6_col4 {\n  background-color: #5875e1;\n  color: #f1f1f1;\n}\n#T_4d79f_row7_col1, #T_4d79f_row7_col3 {\n  background-color: #3d50c3;\n  color: #f1f1f1;\n}\n#T_4d79f_row7_col2 {\n  background-color: #d95847;\n  color: #f1f1f1;\n}\n#T_4d79f_row7_col4 {\n  background-color: #4358cb;\n  color: #f1f1f1;\n}\n#T_4d79f_row7_col6 {\n  background-color: #cad8ef;\n  color: #000000;\n}\n</style>\n<table id=\"T_4d79f\">\n  <thead>\n    <tr>\n      <th class=\"blank level0\" >&nbsp;</th>\n      <th id=\"T_4d79f_level0_col0\" class=\"col_heading level0 col0\" >year</th>\n      <th id=\"T_4d79f_level0_col1\" class=\"col_heading level0 col1\" >condition</th>\n      <th id=\"T_4d79f_level0_col2\" class=\"col_heading level0 col2\" >odometer</th>\n      <th id=\"T_4d79f_level0_col3\" class=\"col_heading level0 col3\" >sellingprice</th>\n      <th id=\"T_4d79f_level0_col4\" class=\"col_heading level0 col4\" >saledate_week_day</th>\n      <th id=\"T_4d79f_level0_col5\" class=\"col_heading level0 col5\" >saledate_month</th>\n      <th id=\"T_4d79f_level0_col6\" class=\"col_heading level0 col6\" >saledate_year</th>\n      <th id=\"T_4d79f_level0_col7\" class=\"col_heading level0 col7\" >car_age</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th id=\"T_4d79f_level0_row0\" class=\"row_heading level0 row0\" >year</th>\n      <td id=\"T_4d79f_row0_col0\" class=\"data row0 col0\" >1.000000</td>\n      <td id=\"T_4d79f_row0_col1\" class=\"data row0 col1\" >0.508836</td>\n      <td id=\"T_4d79f_row0_col2\" class=\"data row0 col2\" >-0.799027</td>\n      <td id=\"T_4d79f_row0_col3\" class=\"data row0 col3\" >0.623031</td>\n      <td id=\"T_4d79f_row0_col4\" class=\"data row0 col4\" >0.037312</td>\n      <td id=\"T_4d79f_row0_col5\" class=\"data row0 col5\" >-0.050652</td>\n      <td id=\"T_4d79f_row0_col6\" class=\"data row0 col6\" >0.118899</td>\n      <td id=\"T_4d79f_row0_col7\" class=\"data row0 col7\" >-0.996742</td>\n    </tr>\n    <tr>\n      <th id=\"T_4d79f_level0_row1\" class=\"row_heading level0 row1\" >condition</th>\n      <td id=\"T_4d79f_row1_col0\" class=\"data row1 col0\" >0.508836</td>\n      <td id=\"T_4d79f_row1_col1\" class=\"data row1 col1\" >1.000000</td>\n      <td id=\"T_4d79f_row1_col2\" class=\"data row1 col2\" >-0.520901</td>\n      <td id=\"T_4d79f_row1_col3\" class=\"data row1 col3\" >0.536352</td>\n      <td id=\"T_4d79f_row1_col4\" class=\"data row1 col4\" >0.040975</td>\n      <td id=\"T_4d79f_row1_col5\" class=\"data row1 col5\" >-0.041923</td>\n      <td id=\"T_4d79f_row1_col6\" class=\"data row1 col6\" >0.058489</td>\n      <td id=\"T_4d79f_row1_col7\" class=\"data row1 col7\" >-0.507351</td>\n    </tr>\n    <tr>\n      <th id=\"T_4d79f_level0_row2\" class=\"row_heading level0 row2\" >odometer</th>\n      <td id=\"T_4d79f_row2_col0\" class=\"data row2 col0\" >-0.799027</td>\n      <td id=\"T_4d79f_row2_col1\" class=\"data row2 col1\" >-0.520901</td>\n      <td id=\"T_4d79f_row2_col2\" class=\"data row2 col2\" >1.000000</td>\n      <td id=\"T_4d79f_row2_col3\" class=\"data row2 col3\" >-0.637667</td>\n      <td id=\"T_4d79f_row2_col4\" class=\"data row2 col4\" >-0.067362</td>\n      <td id=\"T_4d79f_row2_col5\" class=\"data row2 col5\" >0.047124</td>\n      <td id=\"T_4d79f_row2_col6\" class=\"data row2 col6\" >-0.092129</td>\n      <td id=\"T_4d79f_row2_col7\" class=\"data row2 col7\" >0.796649</td>\n    </tr>\n    <tr>\n      <th id=\"T_4d79f_level0_row3\" class=\"row_heading level0 row3\" >sellingprice</th>\n      <td id=\"T_4d79f_row3_col0\" class=\"data row3 col0\" >0.623031</td>\n      <td id=\"T_4d79f_row3_col1\" class=\"data row3 col1\" >0.536352</td>\n      <td id=\"T_4d79f_row3_col2\" class=\"data row3 col2\" >-0.637667</td>\n      <td id=\"T_4d79f_row3_col3\" class=\"data row3 col3\" >1.000000</td>\n      <td id=\"T_4d79f_row3_col4\" class=\"data row3 col4\" >0.084993</td>\n      <td id=\"T_4d79f_row3_col5\" class=\"data row3 col5\" >-0.043435</td>\n      <td id=\"T_4d79f_row3_col6\" class=\"data row3 col6\" >0.086422</td>\n      <td id=\"T_4d79f_row3_col7\" class=\"data row3 col7\" >-0.619999</td>\n    </tr>\n    <tr>\n      <th id=\"T_4d79f_level0_row4\" class=\"row_heading level0 row4\" >saledate_week_day</th>\n      <td id=\"T_4d79f_row4_col0\" class=\"data row4 col0\" >0.037312</td>\n      <td id=\"T_4d79f_row4_col1\" class=\"data row4 col1\" >0.040975</td>\n      <td id=\"T_4d79f_row4_col2\" class=\"data row4 col2\" >-0.067362</td>\n      <td id=\"T_4d79f_row4_col3\" class=\"data row4 col3\" >0.084993</td>\n      <td id=\"T_4d79f_row4_col4\" class=\"data row4 col4\" >1.000000</td>\n      <td id=\"T_4d79f_row4_col5\" class=\"data row4 col5\" >-0.009910</td>\n      <td id=\"T_4d79f_row4_col6\" class=\"data row4 col6\" >0.033663</td>\n      <td id=\"T_4d79f_row4_col7\" class=\"data row4 col7\" >-0.034849</td>\n    </tr>\n    <tr>\n      <th id=\"T_4d79f_level0_row5\" class=\"row_heading level0 row5\" >saledate_month</th>\n      <td id=\"T_4d79f_row5_col0\" class=\"data row5 col0\" >-0.050652</td>\n      <td id=\"T_4d79f_row5_col1\" class=\"data row5 col1\" >-0.041923</td>\n      <td id=\"T_4d79f_row5_col2\" class=\"data row5 col2\" >0.047124</td>\n      <td id=\"T_4d79f_row5_col3\" class=\"data row5 col3\" >-0.043435</td>\n      <td id=\"T_4d79f_row5_col4\" class=\"data row5 col4\" >-0.009910</td>\n      <td id=\"T_4d79f_row5_col5\" class=\"data row5 col5\" >1.000000</td>\n      <td id=\"T_4d79f_row5_col6\" class=\"data row5 col6\" >-0.824143</td>\n      <td id=\"T_4d79f_row5_col7\" class=\"data row5 col7\" >-0.015870</td>\n    </tr>\n    <tr>\n      <th id=\"T_4d79f_level0_row6\" class=\"row_heading level0 row6\" >saledate_year</th>\n      <td id=\"T_4d79f_row6_col0\" class=\"data row6 col0\" >0.118899</td>\n      <td id=\"T_4d79f_row6_col1\" class=\"data row6 col1\" >0.058489</td>\n      <td id=\"T_4d79f_row6_col2\" class=\"data row6 col2\" >-0.092129</td>\n      <td id=\"T_4d79f_row6_col3\" class=\"data row6 col3\" >0.086422</td>\n      <td id=\"T_4d79f_row6_col4\" class=\"data row6 col4\" >0.033663</td>\n      <td id=\"T_4d79f_row6_col5\" class=\"data row6 col5\" >-0.824143</td>\n      <td id=\"T_4d79f_row6_col6\" class=\"data row6 col6\" >1.000000</td>\n      <td id=\"T_4d79f_row6_col7\" class=\"data row6 col7\" >-0.038566</td>\n    </tr>\n    <tr>\n      <th id=\"T_4d79f_level0_row7\" class=\"row_heading level0 row7\" >car_age</th>\n      <td id=\"T_4d79f_row7_col0\" class=\"data row7 col0\" >-0.996742</td>\n      <td id=\"T_4d79f_row7_col1\" class=\"data row7 col1\" >-0.507351</td>\n      <td id=\"T_4d79f_row7_col2\" class=\"data row7 col2\" >0.796649</td>\n      <td id=\"T_4d79f_row7_col3\" class=\"data row7 col3\" >-0.619999</td>\n      <td id=\"T_4d79f_row7_col4\" class=\"data row7 col4\" >-0.034849</td>\n      <td id=\"T_4d79f_row7_col5\" class=\"data row7 col5\" >-0.015870</td>\n      <td id=\"T_4d79f_row7_col6\" class=\"data row7 col6\" >-0.038566</td>\n      <td id=\"T_4d79f_row7_col7\" class=\"data row7 col7\" >1.000000</td>\n    </tr>\n  </tbody>\n</table>\n"
     },
     "execution_count": 195,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#  Проверим корреляции получившихся столбцов\n",
    "corr = train.corr()\n",
    "corr.style.background_gradient(cmap='coolwarm')"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "В данном подпункте были добавлены 4 столбцов в синтетическими данными - год, месяц и день недели продажи авто. Также полный возраст авто, устранены аномалии в возрасте авто. Доказана мультиколлинеарность данных."
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "# Подбор и обучение моделей машинного обучения <a name=\"chapter5\"></a>"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "Для решения задачи обучения оптимальной модели потребуется:\n",
    "1) выполнить кодирование категориальных значений\n",
    "2) произвести уравнивание (скейлинг) данных\n",
    "3) подобрать оптимальные гиперпараметры модели\n",
    "4) произвести кроссвалидацию модели\n",
    "\n",
    "Для решения задачи регрессии достаточно порядково кодировать категориальные переменные, для этого необходим OrdinalEncoder.\n",
    "Для уравнивания данных используем StandardScaler.\n",
    "Чтобы обучить оптимальную модель, следует подобрать её параметры. Для такого большого датафрейма подойдет  RandomizedSearchCV ввиду быстроты выполнения."
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## Разбивка данных на признаки и таргет <a name=\"chapter5.1\"></a>"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 196,
   "outputs": [],
   "source": [
    "# Разобьём данные трейна на таргет и данные для обучения\n",
    "target_train = train['sellingprice']\n",
    "features_train = train.drop(['sellingprice'], axis=1)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 197,
   "outputs": [],
   "source": [
    "features_test = test"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 198,
   "outputs": [],
   "source": [
    "# Выявим количественные и категориальные колонки\n",
    "categorical_columns = list(filter(lambda column: is_string_dtype(features_train[column]), features_train.columns))\n",
    "numeric_columns = list(filter(lambda column: not is_string_dtype(features_train[column]), features_train.columns))"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 199,
   "outputs": [
    {
     "data": {
      "text/plain": "['make', 'model', 'trim', 'body', 'transmission', 'state', 'color', 'interior']"
     },
     "execution_count": 199,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "categorical_columns"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## Кодирование категориальных столбцов <a name=\"chapter5.2\"></a>"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 200,
   "outputs": [
    {
     "data": {
      "text/plain": "OrdinalEncoder(handle_unknown='use_encoded_value', unknown_value=-1)",
      "text/html": "<style>#sk-container-id-5 {color: black;background-color: white;}#sk-container-id-5 pre{padding: 0;}#sk-container-id-5 div.sk-toggleable {background-color: white;}#sk-container-id-5 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-5 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-5 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-5 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-5 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-5 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-5 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-5 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-5 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-5 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-5 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-5 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-5 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-5 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-5 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-5 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-5 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-5 div.sk-item {position: relative;z-index: 1;}#sk-container-id-5 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-5 div.sk-item::before, #sk-container-id-5 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-5 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-5 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-5 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-5 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-5 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-5 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-5 div.sk-label-container {text-align: center;}#sk-container-id-5 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-5 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-5\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>OrdinalEncoder(handle_unknown=&#x27;use_encoded_value&#x27;, unknown_value=-1)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-11\" type=\"checkbox\" checked><label for=\"sk-estimator-id-11\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">OrdinalEncoder</label><div class=\"sk-toggleable__content\"><pre>OrdinalEncoder(handle_unknown=&#x27;use_encoded_value&#x27;, unknown_value=-1)</pre></div></div></div></div></div>"
     },
     "execution_count": 200,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Создадим и обучим на трейне декодер. Неизвестные категориальные значения из теста будем менять на -1\n",
    "encoder = OrdinalEncoder(handle_unknown='use_encoded_value', unknown_value=-1)\n",
    "encoder.fit(features_train[categorical_columns])"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 201,
   "outputs": [
    {
     "data": {
      "text/plain": "(411646, 8)"
     },
     "execution_count": 201,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#  Кодируем трейн\n",
    "features_train_encoded = pd.DataFrame(\n",
    "    encoder.transform(features_train[categorical_columns]), # .toarray()\n",
    "    columns=encoder.get_feature_names_out(categorical_columns),\n",
    "    index=features_train.index\n",
    ")\n",
    "features_train_encoded.shape"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 202,
   "outputs": [
    {
     "data": {
      "text/plain": "(411646, 15)"
     },
     "execution_count": 202,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "features_train_encoded = pd.concat((features_train[numeric_columns], features_train_encoded), axis=1)\n",
    "features_train_encoded.shape"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 203,
   "outputs": [
    {
     "data": {
      "text/plain": "   year  condition  odometer  saledate_week_day  saledate_month  \\\n0  2011        4.0  111041.0                  1               6   \n1  2014        3.0   31034.0                  2               2   \n2  2012        2.0   35619.0                  2               6   \n3  2003        2.0  131301.0                  2               6   \n4  2007        2.0  127709.0                  1               2   \n\n   saledate_year  car_age  make  model    trim  body  transmission  state  \\\n0           2015        4  12.0  227.0  1312.0   6.0           1.0   12.0   \n1           2015        1  12.0  301.0  1282.0   5.0           1.0   15.0   \n2           2015        3  32.0  618.0    67.0   5.0           1.0   19.0   \n3           2015       12  16.0  357.0   546.0   6.0           1.0   33.0   \n4           2015        8  12.0  301.0  1312.0   5.0           1.0   12.0   \n\n   color  interior  \n0    1.0       1.0  \n1    1.0       1.0  \n2    1.0       1.0  \n3    6.0       0.0  \n4    1.0       1.0  ",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>year</th>\n      <th>condition</th>\n      <th>odometer</th>\n      <th>saledate_week_day</th>\n      <th>saledate_month</th>\n      <th>saledate_year</th>\n      <th>car_age</th>\n      <th>make</th>\n      <th>model</th>\n      <th>trim</th>\n      <th>body</th>\n      <th>transmission</th>\n      <th>state</th>\n      <th>color</th>\n      <th>interior</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>2011</td>\n      <td>4.0</td>\n      <td>111041.0</td>\n      <td>1</td>\n      <td>6</td>\n      <td>2015</td>\n      <td>4</td>\n      <td>12.0</td>\n      <td>227.0</td>\n      <td>1312.0</td>\n      <td>6.0</td>\n      <td>1.0</td>\n      <td>12.0</td>\n      <td>1.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>2014</td>\n      <td>3.0</td>\n      <td>31034.0</td>\n      <td>2</td>\n      <td>2</td>\n      <td>2015</td>\n      <td>1</td>\n      <td>12.0</td>\n      <td>301.0</td>\n      <td>1282.0</td>\n      <td>5.0</td>\n      <td>1.0</td>\n      <td>15.0</td>\n      <td>1.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>2012</td>\n      <td>2.0</td>\n      <td>35619.0</td>\n      <td>2</td>\n      <td>6</td>\n      <td>2015</td>\n      <td>3</td>\n      <td>32.0</td>\n      <td>618.0</td>\n      <td>67.0</td>\n      <td>5.0</td>\n      <td>1.0</td>\n      <td>19.0</td>\n      <td>1.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>2003</td>\n      <td>2.0</td>\n      <td>131301.0</td>\n      <td>2</td>\n      <td>6</td>\n      <td>2015</td>\n      <td>12</td>\n      <td>16.0</td>\n      <td>357.0</td>\n      <td>546.0</td>\n      <td>6.0</td>\n      <td>1.0</td>\n      <td>33.0</td>\n      <td>6.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>2007</td>\n      <td>2.0</td>\n      <td>127709.0</td>\n      <td>1</td>\n      <td>2</td>\n      <td>2015</td>\n      <td>8</td>\n      <td>12.0</td>\n      <td>301.0</td>\n      <td>1312.0</td>\n      <td>5.0</td>\n      <td>1.0</td>\n      <td>12.0</td>\n      <td>1.0</td>\n      <td>1.0</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "execution_count": 203,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "features_train_encoded.head()"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 204,
   "outputs": [],
   "source": [
    "#  Кодируем тест\n",
    "features_test_encoded = pd.DataFrame(\n",
    "    encoder.transform(features_test[categorical_columns]), # .toarray()\n",
    "    columns=encoder.get_feature_names_out(categorical_columns),\n",
    "    index=features_test.index\n",
    ")\n",
    "features_test_encoded = pd.concat((features_test[numeric_columns], features_test_encoded), axis=1)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 205,
   "outputs": [
    {
     "data": {
      "text/plain": "   year  condition  odometer  saledate_week_day  saledate_month  \\\n0  2005        2.0  116970.0                  2               1   \n1  2014        4.0    6286.0                  4               2   \n2  2013        4.0   11831.0                  1               2   \n3  2013        2.0   57105.0                  4               3   \n4  2013        2.0   31083.0                  2               6   \n5  2003        2.0  104155.0                  1               6   \n6  2013        3.0   30669.0                  1               3   \n7  2013        3.0   87862.0                  1               2   \n8  2011        3.0   47028.0                  2               2   \n9  2007        3.0  191211.0                  1               2   \n\n   saledate_year  car_age  make  model    trim  body  transmission  state  \\\n0           2015       10   6.0  191.0   546.0   5.0           1.0    3.0   \n1           2015        1  14.0  612.0   172.0   7.0           1.0   28.0   \n2           2015        2  32.0  479.0  1233.0   6.0           1.0   24.0   \n3           2015        2   7.0  370.0  1040.0   5.0           1.0    5.0   \n4           2015        2  32.0  688.0  1451.0   4.0           1.0   32.0   \n5           2015       12  45.0  504.0   880.0   8.0           1.0   17.0   \n6           2015        2  17.0  650.0   878.0   5.0           1.0    8.0   \n7           2015        2  12.0  270.0   546.0   6.0           1.0   17.0   \n8           2015        4  18.0  310.0   851.0   5.0           1.0   32.0   \n9           2015        8   7.0  670.0    45.0   6.0           1.0    6.0   \n\n   color  interior  \n0   15.0       1.0  \n1   17.0       6.0  \n2    7.0       1.0  \n3   15.0       1.0  \n4    1.0       1.0  \n5   15.0       1.0  \n6   15.0       6.0  \n7    1.0       6.0  \n8    1.0       0.0  \n9    1.0      13.0  ",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>year</th>\n      <th>condition</th>\n      <th>odometer</th>\n      <th>saledate_week_day</th>\n      <th>saledate_month</th>\n      <th>saledate_year</th>\n      <th>car_age</th>\n      <th>make</th>\n      <th>model</th>\n      <th>trim</th>\n      <th>body</th>\n      <th>transmission</th>\n      <th>state</th>\n      <th>color</th>\n      <th>interior</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>2005</td>\n      <td>2.0</td>\n      <td>116970.0</td>\n      <td>2</td>\n      <td>1</td>\n      <td>2015</td>\n      <td>10</td>\n      <td>6.0</td>\n      <td>191.0</td>\n      <td>546.0</td>\n      <td>5.0</td>\n      <td>1.0</td>\n      <td>3.0</td>\n      <td>15.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>2014</td>\n      <td>4.0</td>\n      <td>6286.0</td>\n      <td>4</td>\n      <td>2</td>\n      <td>2015</td>\n      <td>1</td>\n      <td>14.0</td>\n      <td>612.0</td>\n      <td>172.0</td>\n      <td>7.0</td>\n      <td>1.0</td>\n      <td>28.0</td>\n      <td>17.0</td>\n      <td>6.0</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>2013</td>\n      <td>4.0</td>\n      <td>11831.0</td>\n      <td>1</td>\n      <td>2</td>\n      <td>2015</td>\n      <td>2</td>\n      <td>32.0</td>\n      <td>479.0</td>\n      <td>1233.0</td>\n      <td>6.0</td>\n      <td>1.0</td>\n      <td>24.0</td>\n      <td>7.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>2013</td>\n      <td>2.0</td>\n      <td>57105.0</td>\n      <td>4</td>\n      <td>3</td>\n      <td>2015</td>\n      <td>2</td>\n      <td>7.0</td>\n      <td>370.0</td>\n      <td>1040.0</td>\n      <td>5.0</td>\n      <td>1.0</td>\n      <td>5.0</td>\n      <td>15.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>2013</td>\n      <td>2.0</td>\n      <td>31083.0</td>\n      <td>2</td>\n      <td>6</td>\n      <td>2015</td>\n      <td>2</td>\n      <td>32.0</td>\n      <td>688.0</td>\n      <td>1451.0</td>\n      <td>4.0</td>\n      <td>1.0</td>\n      <td>32.0</td>\n      <td>1.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>5</th>\n      <td>2003</td>\n      <td>2.0</td>\n      <td>104155.0</td>\n      <td>1</td>\n      <td>6</td>\n      <td>2015</td>\n      <td>12</td>\n      <td>45.0</td>\n      <td>504.0</td>\n      <td>880.0</td>\n      <td>8.0</td>\n      <td>1.0</td>\n      <td>17.0</td>\n      <td>15.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>6</th>\n      <td>2013</td>\n      <td>3.0</td>\n      <td>30669.0</td>\n      <td>1</td>\n      <td>3</td>\n      <td>2015</td>\n      <td>2</td>\n      <td>17.0</td>\n      <td>650.0</td>\n      <td>878.0</td>\n      <td>5.0</td>\n      <td>1.0</td>\n      <td>8.0</td>\n      <td>15.0</td>\n      <td>6.0</td>\n    </tr>\n    <tr>\n      <th>7</th>\n      <td>2013</td>\n      <td>3.0</td>\n      <td>87862.0</td>\n      <td>1</td>\n      <td>2</td>\n      <td>2015</td>\n      <td>2</td>\n      <td>12.0</td>\n      <td>270.0</td>\n      <td>546.0</td>\n      <td>6.0</td>\n      <td>1.0</td>\n      <td>17.0</td>\n      <td>1.0</td>\n      <td>6.0</td>\n    </tr>\n    <tr>\n      <th>8</th>\n      <td>2011</td>\n      <td>3.0</td>\n      <td>47028.0</td>\n      <td>2</td>\n      <td>2</td>\n      <td>2015</td>\n      <td>4</td>\n      <td>18.0</td>\n      <td>310.0</td>\n      <td>851.0</td>\n      <td>5.0</td>\n      <td>1.0</td>\n      <td>32.0</td>\n      <td>1.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>9</th>\n      <td>2007</td>\n      <td>3.0</td>\n      <td>191211.0</td>\n      <td>1</td>\n      <td>2</td>\n      <td>2015</td>\n      <td>8</td>\n      <td>7.0</td>\n      <td>670.0</td>\n      <td>45.0</td>\n      <td>6.0</td>\n      <td>1.0</td>\n      <td>6.0</td>\n      <td>1.0</td>\n      <td>13.0</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 110058 entries, 0 to 110057\n",
      "Data columns (total 15 columns):\n",
      " #   Column             Non-Null Count   Dtype  \n",
      "---  ------             --------------   -----  \n",
      " 0   year               110058 non-null  int64  \n",
      " 1   condition          110058 non-null  Float64\n",
      " 2   odometer           110058 non-null  float64\n",
      " 3   saledate_week_day  110058 non-null  int64  \n",
      " 4   saledate_month     110058 non-null  int64  \n",
      " 5   saledate_year      110058 non-null  int64  \n",
      " 6   car_age            110058 non-null  int64  \n",
      " 7   make               110058 non-null  float64\n",
      " 8   model              110058 non-null  float64\n",
      " 9   trim               110058 non-null  float64\n",
      " 10  body               110058 non-null  float64\n",
      " 11  transmission       110058 non-null  float64\n",
      " 12  state              110058 non-null  float64\n",
      " 13  color              110058 non-null  float64\n",
      " 14  interior           110058 non-null  float64\n",
      "dtypes: Float64(1), float64(9), int64(5)\n",
      "memory usage: 12.7 MB\n"
     ]
    },
    {
     "data": {
      "text/plain": "None"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": "                      count          mean         std     min      50%  \\\nyear               110058.0   2010.060005     3.96019  1982.0   2012.0   \ncondition          110058.0      2.940063     1.00622     1.0      3.0   \nodometer           110058.0  68074.667943  53517.4034     1.0  51932.5   \nsaledate_week_day  110058.0       2.14287    1.044089     0.0      2.0   \nsaledate_month     110058.0      3.810518    3.241834     1.0      2.0   \nsaledate_year      110058.0   2014.902751    0.296297  2014.0   2015.0   \ncar_age            110058.0      4.842747    3.938529    -1.0      3.0   \nmake               110058.0     19.089698   12.832398    -1.0     15.0   \nmodel              110058.0    346.039425  218.513467    -1.0    301.0   \ntrim               110058.0    969.906604  448.410963    -1.0   1034.0   \nbody               110058.0      4.949236    1.557104     0.0      5.0   \ntransmission       110058.0      1.026095    0.208557     0.0      1.0   \nstate              110058.0     16.207945   11.538929     0.0     14.0   \ncolor              110058.0      9.375875    6.671753     0.0      7.0   \ninterior           110058.0      4.010058    4.277813     0.0      1.0   \n\n                        max  \nyear                 2015.0  \ncondition               5.0  \nodometer           999999.0  \nsaledate_week_day       6.0  \nsaledate_month         12.0  \nsaledate_year        2015.0  \ncar_age                33.0  \nmake                   46.0  \nmodel                 779.0  \ntrim                 1718.0  \nbody                    8.0  \ntransmission            2.0  \nstate                  37.0  \ncolor                  19.0  \ninterior               16.0  ",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>count</th>\n      <th>mean</th>\n      <th>std</th>\n      <th>min</th>\n      <th>50%</th>\n      <th>max</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>year</th>\n      <td>110058.0</td>\n      <td>2010.060005</td>\n      <td>3.96019</td>\n      <td>1982.0</td>\n      <td>2012.0</td>\n      <td>2015.0</td>\n    </tr>\n    <tr>\n      <th>condition</th>\n      <td>110058.0</td>\n      <td>2.940063</td>\n      <td>1.00622</td>\n      <td>1.0</td>\n      <td>3.0</td>\n      <td>5.0</td>\n    </tr>\n    <tr>\n      <th>odometer</th>\n      <td>110058.0</td>\n      <td>68074.667943</td>\n      <td>53517.4034</td>\n      <td>1.0</td>\n      <td>51932.5</td>\n      <td>999999.0</td>\n    </tr>\n    <tr>\n      <th>saledate_week_day</th>\n      <td>110058.0</td>\n      <td>2.14287</td>\n      <td>1.044089</td>\n      <td>0.0</td>\n      <td>2.0</td>\n      <td>6.0</td>\n    </tr>\n    <tr>\n      <th>saledate_month</th>\n      <td>110058.0</td>\n      <td>3.810518</td>\n      <td>3.241834</td>\n      <td>1.0</td>\n      <td>2.0</td>\n      <td>12.0</td>\n    </tr>\n    <tr>\n      <th>saledate_year</th>\n      <td>110058.0</td>\n      <td>2014.902751</td>\n      <td>0.296297</td>\n      <td>2014.0</td>\n      <td>2015.0</td>\n      <td>2015.0</td>\n    </tr>\n    <tr>\n      <th>car_age</th>\n      <td>110058.0</td>\n      <td>4.842747</td>\n      <td>3.938529</td>\n      <td>-1.0</td>\n      <td>3.0</td>\n      <td>33.0</td>\n    </tr>\n    <tr>\n      <th>make</th>\n      <td>110058.0</td>\n      <td>19.089698</td>\n      <td>12.832398</td>\n      <td>-1.0</td>\n      <td>15.0</td>\n      <td>46.0</td>\n    </tr>\n    <tr>\n      <th>model</th>\n      <td>110058.0</td>\n      <td>346.039425</td>\n      <td>218.513467</td>\n      <td>-1.0</td>\n      <td>301.0</td>\n      <td>779.0</td>\n    </tr>\n    <tr>\n      <th>trim</th>\n      <td>110058.0</td>\n      <td>969.906604</td>\n      <td>448.410963</td>\n      <td>-1.0</td>\n      <td>1034.0</td>\n      <td>1718.0</td>\n    </tr>\n    <tr>\n      <th>body</th>\n      <td>110058.0</td>\n      <td>4.949236</td>\n      <td>1.557104</td>\n      <td>0.0</td>\n      <td>5.0</td>\n      <td>8.0</td>\n    </tr>\n    <tr>\n      <th>transmission</th>\n      <td>110058.0</td>\n      <td>1.026095</td>\n      <td>0.208557</td>\n      <td>0.0</td>\n      <td>1.0</td>\n      <td>2.0</td>\n    </tr>\n    <tr>\n      <th>state</th>\n      <td>110058.0</td>\n      <td>16.207945</td>\n      <td>11.538929</td>\n      <td>0.0</td>\n      <td>14.0</td>\n      <td>37.0</td>\n    </tr>\n    <tr>\n      <th>color</th>\n      <td>110058.0</td>\n      <td>9.375875</td>\n      <td>6.671753</td>\n      <td>0.0</td>\n      <td>7.0</td>\n      <td>19.0</td>\n    </tr>\n    <tr>\n      <th>interior</th>\n      <td>110058.0</td>\n      <td>4.010058</td>\n      <td>4.277813</td>\n      <td>0.0</td>\n      <td>1.0</td>\n      <td>16.0</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Количество дублированных строк: 0\n"
     ]
    }
   ],
   "source": [
    "describe_dataframe(features_test_encoded)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## Нормализация данных <a name=\"chapter5.3\"></a>"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 206,
   "outputs": [
    {
     "data": {
      "text/plain": "StandardScaler()",
      "text/html": "<style>#sk-container-id-6 {color: black;background-color: white;}#sk-container-id-6 pre{padding: 0;}#sk-container-id-6 div.sk-toggleable {background-color: white;}#sk-container-id-6 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-6 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-6 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-6 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-6 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-6 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-6 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-6 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-6 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-6 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-6 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-6 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-6 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-6 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-6 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-6 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-6 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-6 div.sk-item {position: relative;z-index: 1;}#sk-container-id-6 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-6 div.sk-item::before, #sk-container-id-6 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-6 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-6 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-6 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-6 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-6 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-6 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-6 div.sk-label-container {text-align: center;}#sk-container-id-6 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-6 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-6\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>StandardScaler()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-12\" type=\"checkbox\" checked><label for=\"sk-estimator-id-12\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">StandardScaler</label><div class=\"sk-toggleable__content\"><pre>StandardScaler()</pre></div></div></div></div></div>"
     },
     "execution_count": 206,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Создадим и обучим скейлер\n",
    "scaler = StandardScaler()\n",
    "scaler.fit(features_train_encoded)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 207,
   "outputs": [
    {
     "data": {
      "text/plain": "        year  condition  odometer  saledate_week_day  saledate_month  \\\n0   0.200119   1.062134  0.960983          -1.094389        0.674607   \n1   1.018457   0.046558 -0.732301          -0.136983       -0.558425   \n2   0.472898  -0.969018 -0.635263          -0.136983        0.674607   \n3  -1.982116  -0.969018  1.389770          -0.136983        0.674607   \n4  -0.890999  -0.969018  1.313748          -1.094389       -0.558425   \n5   0.745677  -0.969018 -1.073891           0.820423        0.366349   \n6  -0.072661   0.046558  1.036032          -2.051795       -0.866683   \n7   0.745677   1.062134 -0.833064          -1.094389       -0.558425   \n8  -2.800454  -1.984595  2.475981           0.820423       -0.866683   \n11  0.200119   1.062134  0.193125          -0.136983       -0.866683   \n\n    saledate_year   car_age      make     model      trim      body  \\\n0         0.32821 -0.174802 -0.595481 -0.587020  0.781260  0.658855   \n1         0.32821 -0.998474 -0.595481 -0.241758  0.714154  0.003214   \n2         0.32821 -0.449360  0.983567  1.237268 -2.003653  0.003214   \n3         0.32821  2.021654 -0.279671  0.019521 -0.932189  0.658855   \n4         0.32821  0.923426 -0.595481 -0.241758  0.781260  0.003214   \n5         0.32821 -0.723917  0.430900  0.523416 -0.932189  0.003214   \n6         0.32821  0.099755  1.220424 -0.134447 -1.431013 -1.308067   \n7         0.32821 -0.723917 -0.595481 -0.447049  0.714154  0.658855   \n8         0.32821  2.845326 -0.200719 -0.568357 -0.189545  0.003214   \n11        0.32821 -0.174802 -1.148147  0.308794 -0.623500  0.003214   \n\n    transmission     state     color  interior  \n0        -0.0864 -0.362034 -1.264381 -0.700759  \n1        -0.0864 -0.101903 -1.264381 -0.700759  \n2        -0.0864  0.244939 -1.264381 -0.700759  \n3        -0.0864  1.458887 -0.513218 -0.937280  \n4        -0.0864 -0.362034 -1.264381 -0.700759  \n5        -0.0864 -0.275324 -1.264381 -0.700759  \n6        -0.0864  0.071518  0.838877 -0.700759  \n7        -0.0864 -0.969008 -1.114149  0.481847  \n8        -0.0864  0.678492 -1.264381  2.137497  \n11       -0.0864 -0.101903  1.139342  2.137497  ",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>year</th>\n      <th>condition</th>\n      <th>odometer</th>\n      <th>saledate_week_day</th>\n      <th>saledate_month</th>\n      <th>saledate_year</th>\n      <th>car_age</th>\n      <th>make</th>\n      <th>model</th>\n      <th>trim</th>\n      <th>body</th>\n      <th>transmission</th>\n      <th>state</th>\n      <th>color</th>\n      <th>interior</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>0.200119</td>\n      <td>1.062134</td>\n      <td>0.960983</td>\n      <td>-1.094389</td>\n      <td>0.674607</td>\n      <td>0.32821</td>\n      <td>-0.174802</td>\n      <td>-0.595481</td>\n      <td>-0.587020</td>\n      <td>0.781260</td>\n      <td>0.658855</td>\n      <td>-0.0864</td>\n      <td>-0.362034</td>\n      <td>-1.264381</td>\n      <td>-0.700759</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>1.018457</td>\n      <td>0.046558</td>\n      <td>-0.732301</td>\n      <td>-0.136983</td>\n      <td>-0.558425</td>\n      <td>0.32821</td>\n      <td>-0.998474</td>\n      <td>-0.595481</td>\n      <td>-0.241758</td>\n      <td>0.714154</td>\n      <td>0.003214</td>\n      <td>-0.0864</td>\n      <td>-0.101903</td>\n      <td>-1.264381</td>\n      <td>-0.700759</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>0.472898</td>\n      <td>-0.969018</td>\n      <td>-0.635263</td>\n      <td>-0.136983</td>\n      <td>0.674607</td>\n      <td>0.32821</td>\n      <td>-0.449360</td>\n      <td>0.983567</td>\n      <td>1.237268</td>\n      <td>-2.003653</td>\n      <td>0.003214</td>\n      <td>-0.0864</td>\n      <td>0.244939</td>\n      <td>-1.264381</td>\n      <td>-0.700759</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>-1.982116</td>\n      <td>-0.969018</td>\n      <td>1.389770</td>\n      <td>-0.136983</td>\n      <td>0.674607</td>\n      <td>0.32821</td>\n      <td>2.021654</td>\n      <td>-0.279671</td>\n      <td>0.019521</td>\n      <td>-0.932189</td>\n      <td>0.658855</td>\n      <td>-0.0864</td>\n      <td>1.458887</td>\n      <td>-0.513218</td>\n      <td>-0.937280</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>-0.890999</td>\n      <td>-0.969018</td>\n      <td>1.313748</td>\n      <td>-1.094389</td>\n      <td>-0.558425</td>\n      <td>0.32821</td>\n      <td>0.923426</td>\n      <td>-0.595481</td>\n      <td>-0.241758</td>\n      <td>0.781260</td>\n      <td>0.003214</td>\n      <td>-0.0864</td>\n      <td>-0.362034</td>\n      <td>-1.264381</td>\n      <td>-0.700759</td>\n    </tr>\n    <tr>\n      <th>5</th>\n      <td>0.745677</td>\n      <td>-0.969018</td>\n      <td>-1.073891</td>\n      <td>0.820423</td>\n      <td>0.366349</td>\n      <td>0.32821</td>\n      <td>-0.723917</td>\n      <td>0.430900</td>\n      <td>0.523416</td>\n      <td>-0.932189</td>\n      <td>0.003214</td>\n      <td>-0.0864</td>\n      <td>-0.275324</td>\n      <td>-1.264381</td>\n      <td>-0.700759</td>\n    </tr>\n    <tr>\n      <th>6</th>\n      <td>-0.072661</td>\n      <td>0.046558</td>\n      <td>1.036032</td>\n      <td>-2.051795</td>\n      <td>-0.866683</td>\n      <td>0.32821</td>\n      <td>0.099755</td>\n      <td>1.220424</td>\n      <td>-0.134447</td>\n      <td>-1.431013</td>\n      <td>-1.308067</td>\n      <td>-0.0864</td>\n      <td>0.071518</td>\n      <td>0.838877</td>\n      <td>-0.700759</td>\n    </tr>\n    <tr>\n      <th>7</th>\n      <td>0.745677</td>\n      <td>1.062134</td>\n      <td>-0.833064</td>\n      <td>-1.094389</td>\n      <td>-0.558425</td>\n      <td>0.32821</td>\n      <td>-0.723917</td>\n      <td>-0.595481</td>\n      <td>-0.447049</td>\n      <td>0.714154</td>\n      <td>0.658855</td>\n      <td>-0.0864</td>\n      <td>-0.969008</td>\n      <td>-1.114149</td>\n      <td>0.481847</td>\n    </tr>\n    <tr>\n      <th>8</th>\n      <td>-2.800454</td>\n      <td>-1.984595</td>\n      <td>2.475981</td>\n      <td>0.820423</td>\n      <td>-0.866683</td>\n      <td>0.32821</td>\n      <td>2.845326</td>\n      <td>-0.200719</td>\n      <td>-0.568357</td>\n      <td>-0.189545</td>\n      <td>0.003214</td>\n      <td>-0.0864</td>\n      <td>0.678492</td>\n      <td>-1.264381</td>\n      <td>2.137497</td>\n    </tr>\n    <tr>\n      <th>11</th>\n      <td>0.200119</td>\n      <td>1.062134</td>\n      <td>0.193125</td>\n      <td>-0.136983</td>\n      <td>-0.866683</td>\n      <td>0.32821</td>\n      <td>-0.174802</td>\n      <td>-1.148147</td>\n      <td>0.308794</td>\n      <td>-0.623500</td>\n      <td>0.003214</td>\n      <td>-0.0864</td>\n      <td>-0.101903</td>\n      <td>1.139342</td>\n      <td>2.137497</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 411646 entries, 0 to 440235\n",
      "Data columns (total 15 columns):\n",
      " #   Column             Non-Null Count   Dtype  \n",
      "---  ------             --------------   -----  \n",
      " 0   year               411646 non-null  float64\n",
      " 1   condition          411646 non-null  float64\n",
      " 2   odometer           411646 non-null  float64\n",
      " 3   saledate_week_day  411646 non-null  float64\n",
      " 4   saledate_month     411646 non-null  float64\n",
      " 5   saledate_year      411646 non-null  float64\n",
      " 6   car_age            411646 non-null  float64\n",
      " 7   make               411646 non-null  float64\n",
      " 8   model              411646 non-null  float64\n",
      " 9   trim               411646 non-null  float64\n",
      " 10  body               411646 non-null  float64\n",
      " 11  transmission       411646 non-null  float64\n",
      " 12  state              411646 non-null  float64\n",
      " 13  color              411646 non-null  float64\n",
      " 14  interior           411646 non-null  float64\n",
      "dtypes: float64(15)\n",
      "memory usage: 66.4 MB\n"
     ]
    },
    {
     "data": {
      "text/plain": "None"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": "                      count          mean       std       min       50%  \\\nyear               411646.0 -1.491239e-15  1.000001 -7.164924  0.472898   \ncondition          411646.0  8.198982e-17  1.000001 -1.984595  0.046558   \nodometer           411646.0 -1.680878e-16  1.000001 -1.319904 -0.303377   \nsaledate_week_day  411646.0  2.057340e-16  1.000001 -2.051795 -0.136983   \nsaledate_month     411646.0 -1.429212e-17  1.000001 -0.866683 -0.558425   \nsaledate_year      411646.0  4.503160e-14  1.000001 -3.046831  0.328210   \ncar_age            411646.0 -8.371592e-18  1.000001 -1.273031 -0.449360   \nmake               411646.0  1.167190e-16  1.000001 -1.542909 -0.358624   \nmodel              411646.0  1.209307e-16  1.000001 -1.646132 -0.204432   \ntrim               411646.0 -6.250213e-17  1.000001 -2.153524  0.159408   \nbody               411646.0  1.192218e-16  1.000001 -3.274988  0.003214   \ntransmission       411646.0 -4.754028e-16  1.000001 -4.552826 -0.086400   \nstate              411646.0 -1.034970e-16  1.000001 -1.402561 -0.188613   \ncolor              411646.0  1.560396e-17  1.000001 -1.414614 -0.362985   \ninterior           411646.0  2.844615e-17  1.000001 -0.937280 -0.700759   \n\n                        max  \nyear               1.291236  \ncondition          2.077711  \nodometer           3.414973  \nsaledate_week_day  3.692641  \nsaledate_month     2.524155  \nsaledate_year      0.328210  \ncar_age            7.238239  \nmake               2.088900  \nmodel              1.988445  \ntrim               1.689433  \nbody               1.970136  \ntransmission       4.380026  \nstate              1.805729  \ncolor              1.439808  \ninterior           2.847060  ",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>count</th>\n      <th>mean</th>\n      <th>std</th>\n      <th>min</th>\n      <th>50%</th>\n      <th>max</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>year</th>\n      <td>411646.0</td>\n      <td>-1.491239e-15</td>\n      <td>1.000001</td>\n      <td>-7.164924</td>\n      <td>0.472898</td>\n      <td>1.291236</td>\n    </tr>\n    <tr>\n      <th>condition</th>\n      <td>411646.0</td>\n      <td>8.198982e-17</td>\n      <td>1.000001</td>\n      <td>-1.984595</td>\n      <td>0.046558</td>\n      <td>2.077711</td>\n    </tr>\n    <tr>\n      <th>odometer</th>\n      <td>411646.0</td>\n      <td>-1.680878e-16</td>\n      <td>1.000001</td>\n      <td>-1.319904</td>\n      <td>-0.303377</td>\n      <td>3.414973</td>\n    </tr>\n    <tr>\n      <th>saledate_week_day</th>\n      <td>411646.0</td>\n      <td>2.057340e-16</td>\n      <td>1.000001</td>\n      <td>-2.051795</td>\n      <td>-0.136983</td>\n      <td>3.692641</td>\n    </tr>\n    <tr>\n      <th>saledate_month</th>\n      <td>411646.0</td>\n      <td>-1.429212e-17</td>\n      <td>1.000001</td>\n      <td>-0.866683</td>\n      <td>-0.558425</td>\n      <td>2.524155</td>\n    </tr>\n    <tr>\n      <th>saledate_year</th>\n      <td>411646.0</td>\n      <td>4.503160e-14</td>\n      <td>1.000001</td>\n      <td>-3.046831</td>\n      <td>0.328210</td>\n      <td>0.328210</td>\n    </tr>\n    <tr>\n      <th>car_age</th>\n      <td>411646.0</td>\n      <td>-8.371592e-18</td>\n      <td>1.000001</td>\n      <td>-1.273031</td>\n      <td>-0.449360</td>\n      <td>7.238239</td>\n    </tr>\n    <tr>\n      <th>make</th>\n      <td>411646.0</td>\n      <td>1.167190e-16</td>\n      <td>1.000001</td>\n      <td>-1.542909</td>\n      <td>-0.358624</td>\n      <td>2.088900</td>\n    </tr>\n    <tr>\n      <th>model</th>\n      <td>411646.0</td>\n      <td>1.209307e-16</td>\n      <td>1.000001</td>\n      <td>-1.646132</td>\n      <td>-0.204432</td>\n      <td>1.988445</td>\n    </tr>\n    <tr>\n      <th>trim</th>\n      <td>411646.0</td>\n      <td>-6.250213e-17</td>\n      <td>1.000001</td>\n      <td>-2.153524</td>\n      <td>0.159408</td>\n      <td>1.689433</td>\n    </tr>\n    <tr>\n      <th>body</th>\n      <td>411646.0</td>\n      <td>1.192218e-16</td>\n      <td>1.000001</td>\n      <td>-3.274988</td>\n      <td>0.003214</td>\n      <td>1.970136</td>\n    </tr>\n    <tr>\n      <th>transmission</th>\n      <td>411646.0</td>\n      <td>-4.754028e-16</td>\n      <td>1.000001</td>\n      <td>-4.552826</td>\n      <td>-0.086400</td>\n      <td>4.380026</td>\n    </tr>\n    <tr>\n      <th>state</th>\n      <td>411646.0</td>\n      <td>-1.034970e-16</td>\n      <td>1.000001</td>\n      <td>-1.402561</td>\n      <td>-0.188613</td>\n      <td>1.805729</td>\n    </tr>\n    <tr>\n      <th>color</th>\n      <td>411646.0</td>\n      <td>1.560396e-17</td>\n      <td>1.000001</td>\n      <td>-1.414614</td>\n      <td>-0.362985</td>\n      <td>1.439808</td>\n    </tr>\n    <tr>\n      <th>interior</th>\n      <td>411646.0</td>\n      <td>2.844615e-17</td>\n      <td>1.000001</td>\n      <td>-0.937280</td>\n      <td>-0.700759</td>\n      <td>2.847060</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Количество дублированных строк: 0\n"
     ]
    }
   ],
   "source": [
    "# Проводим скейлинг трейна\n",
    "features_train_scaled = pd.DataFrame(\n",
    "    scaler.transform(features_train_encoded),\n",
    "    columns=features_train_encoded.columns,\n",
    "    index=features_train_encoded.index)\n",
    "describe_dataframe(features_train_scaled)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 208,
   "outputs": [
    {
     "data": {
      "text/plain": "       year  condition  odometer  saledate_week_day  saledate_month  \\\n0 -1.436558  -0.969018  1.086466          -0.136983       -0.866683   \n1  1.018457   1.062134 -1.256073           1.777829       -0.558425   \n2  0.745677   1.062134 -1.138717          -1.094389       -0.558425   \n3  0.745677  -0.969018 -0.180529           1.777829       -0.250167   \n4  0.745677  -0.969018 -0.731264          -0.136983        0.674607   \n5 -1.982116  -0.969018  0.815247          -1.094389        0.674607   \n6  0.745677   0.046558 -0.740026          -1.094389       -0.250167   \n7  0.745677   0.046558  0.470418          -1.094389       -0.558425   \n8  0.200119   0.046558 -0.393801          -0.136983       -0.558425   \n9 -0.890999   0.046558  2.657718          -1.094389       -0.558425   \n\n   saledate_year   car_age      make     model      trim      body  \\\n0        0.32821  1.472540 -1.069195 -0.754985 -0.932189  0.003214   \n1        0.32821 -0.998474 -0.437576  1.209273 -1.768781  1.314495   \n2        0.32821 -0.723917  0.983567  0.588736  0.604547  0.658855   \n3        0.32821 -0.723917 -0.990243  0.080175  0.172829  0.003214   \n4        0.32821 -0.723917  0.983567  1.563866  1.092186 -0.652426   \n5        0.32821  2.021654  2.009948  0.705378 -0.185071  1.970136   \n6        0.32821 -0.723917 -0.200719  1.386570 -0.189545  0.003214   \n7        0.32821 -0.723917 -0.595481 -0.386395 -0.932189  0.658855   \n8        0.32821 -0.174802 -0.121766 -0.199767 -0.249941  0.003214   \n9        0.32821  0.923426 -0.990243  1.479884 -2.052865  0.658855   \n\n   transmission     state     color  interior  \n0       -0.0864 -1.142429  0.838877 -0.700759  \n1       -0.0864  1.025334  1.139342  0.481847  \n2       -0.0864  0.678492 -0.362985 -0.700759  \n3       -0.0864 -0.969008  0.838877 -0.700759  \n4       -0.0864  1.372176 -1.264381 -0.700759  \n5       -0.0864  0.071518  0.838877 -0.700759  \n6       -0.0864 -0.708876  0.838877  0.481847  \n7       -0.0864  0.071518 -1.264381  0.481847  \n8       -0.0864  1.372176 -1.264381 -0.937280  \n9       -0.0864 -0.882297 -1.264381  2.137497  ",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>year</th>\n      <th>condition</th>\n      <th>odometer</th>\n      <th>saledate_week_day</th>\n      <th>saledate_month</th>\n      <th>saledate_year</th>\n      <th>car_age</th>\n      <th>make</th>\n      <th>model</th>\n      <th>trim</th>\n      <th>body</th>\n      <th>transmission</th>\n      <th>state</th>\n      <th>color</th>\n      <th>interior</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>-1.436558</td>\n      <td>-0.969018</td>\n      <td>1.086466</td>\n      <td>-0.136983</td>\n      <td>-0.866683</td>\n      <td>0.32821</td>\n      <td>1.472540</td>\n      <td>-1.069195</td>\n      <td>-0.754985</td>\n      <td>-0.932189</td>\n      <td>0.003214</td>\n      <td>-0.0864</td>\n      <td>-1.142429</td>\n      <td>0.838877</td>\n      <td>-0.700759</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>1.018457</td>\n      <td>1.062134</td>\n      <td>-1.256073</td>\n      <td>1.777829</td>\n      <td>-0.558425</td>\n      <td>0.32821</td>\n      <td>-0.998474</td>\n      <td>-0.437576</td>\n      <td>1.209273</td>\n      <td>-1.768781</td>\n      <td>1.314495</td>\n      <td>-0.0864</td>\n      <td>1.025334</td>\n      <td>1.139342</td>\n      <td>0.481847</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>0.745677</td>\n      <td>1.062134</td>\n      <td>-1.138717</td>\n      <td>-1.094389</td>\n      <td>-0.558425</td>\n      <td>0.32821</td>\n      <td>-0.723917</td>\n      <td>0.983567</td>\n      <td>0.588736</td>\n      <td>0.604547</td>\n      <td>0.658855</td>\n      <td>-0.0864</td>\n      <td>0.678492</td>\n      <td>-0.362985</td>\n      <td>-0.700759</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>0.745677</td>\n      <td>-0.969018</td>\n      <td>-0.180529</td>\n      <td>1.777829</td>\n      <td>-0.250167</td>\n      <td>0.32821</td>\n      <td>-0.723917</td>\n      <td>-0.990243</td>\n      <td>0.080175</td>\n      <td>0.172829</td>\n      <td>0.003214</td>\n      <td>-0.0864</td>\n      <td>-0.969008</td>\n      <td>0.838877</td>\n      <td>-0.700759</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>0.745677</td>\n      <td>-0.969018</td>\n      <td>-0.731264</td>\n      <td>-0.136983</td>\n      <td>0.674607</td>\n      <td>0.32821</td>\n      <td>-0.723917</td>\n      <td>0.983567</td>\n      <td>1.563866</td>\n      <td>1.092186</td>\n      <td>-0.652426</td>\n      <td>-0.0864</td>\n      <td>1.372176</td>\n      <td>-1.264381</td>\n      <td>-0.700759</td>\n    </tr>\n    <tr>\n      <th>5</th>\n      <td>-1.982116</td>\n      <td>-0.969018</td>\n      <td>0.815247</td>\n      <td>-1.094389</td>\n      <td>0.674607</td>\n      <td>0.32821</td>\n      <td>2.021654</td>\n      <td>2.009948</td>\n      <td>0.705378</td>\n      <td>-0.185071</td>\n      <td>1.970136</td>\n      <td>-0.0864</td>\n      <td>0.071518</td>\n      <td>0.838877</td>\n      <td>-0.700759</td>\n    </tr>\n    <tr>\n      <th>6</th>\n      <td>0.745677</td>\n      <td>0.046558</td>\n      <td>-0.740026</td>\n      <td>-1.094389</td>\n      <td>-0.250167</td>\n      <td>0.32821</td>\n      <td>-0.723917</td>\n      <td>-0.200719</td>\n      <td>1.386570</td>\n      <td>-0.189545</td>\n      <td>0.003214</td>\n      <td>-0.0864</td>\n      <td>-0.708876</td>\n      <td>0.838877</td>\n      <td>0.481847</td>\n    </tr>\n    <tr>\n      <th>7</th>\n      <td>0.745677</td>\n      <td>0.046558</td>\n      <td>0.470418</td>\n      <td>-1.094389</td>\n      <td>-0.558425</td>\n      <td>0.32821</td>\n      <td>-0.723917</td>\n      <td>-0.595481</td>\n      <td>-0.386395</td>\n      <td>-0.932189</td>\n      <td>0.658855</td>\n      <td>-0.0864</td>\n      <td>0.071518</td>\n      <td>-1.264381</td>\n      <td>0.481847</td>\n    </tr>\n    <tr>\n      <th>8</th>\n      <td>0.200119</td>\n      <td>0.046558</td>\n      <td>-0.393801</td>\n      <td>-0.136983</td>\n      <td>-0.558425</td>\n      <td>0.32821</td>\n      <td>-0.174802</td>\n      <td>-0.121766</td>\n      <td>-0.199767</td>\n      <td>-0.249941</td>\n      <td>0.003214</td>\n      <td>-0.0864</td>\n      <td>1.372176</td>\n      <td>-1.264381</td>\n      <td>-0.937280</td>\n    </tr>\n    <tr>\n      <th>9</th>\n      <td>-0.890999</td>\n      <td>0.046558</td>\n      <td>2.657718</td>\n      <td>-1.094389</td>\n      <td>-0.558425</td>\n      <td>0.32821</td>\n      <td>0.923426</td>\n      <td>-0.990243</td>\n      <td>1.479884</td>\n      <td>-2.052865</td>\n      <td>0.658855</td>\n      <td>-0.0864</td>\n      <td>-0.882297</td>\n      <td>-1.264381</td>\n      <td>2.137497</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 110058 entries, 0 to 110057\n",
      "Data columns (total 15 columns):\n",
      " #   Column             Non-Null Count   Dtype  \n",
      "---  ------             --------------   -----  \n",
      " 0   year               110058 non-null  float64\n",
      " 1   condition          110058 non-null  float64\n",
      " 2   odometer           110058 non-null  float64\n",
      " 3   saledate_week_day  110058 non-null  float64\n",
      " 4   saledate_month     110058 non-null  float64\n",
      " 5   saledate_year      110058 non-null  float64\n",
      " 6   car_age            110058 non-null  float64\n",
      " 7   make               110058 non-null  float64\n",
      " 8   model              110058 non-null  float64\n",
      " 9   trim               110058 non-null  float64\n",
      " 10  body               110058 non-null  float64\n",
      " 11  transmission       110058 non-null  float64\n",
      " 12  state              110058 non-null  float64\n",
      " 13  color              110058 non-null  float64\n",
      " 14  interior           110058 non-null  float64\n",
      "dtypes: float64(15)\n",
      "memory usage: 12.6 MB\n"
     ]
    },
    {
     "data": {
      "text/plain": "None"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": "                      count      mean       std       min       50%        max\nyear               110058.0 -0.056293  1.080258 -7.710482  0.472898   1.291236\ncondition          110058.0 -0.014312  1.021893 -1.984595  0.046558   2.077711\nodometer           110058.0  0.051635  1.132653 -1.389090 -0.290001  19.775073\nsaledate_week_day  110058.0 -0.000198  0.999617 -2.051795 -0.136983   3.692641\nsaledate_month     110058.0 -0.000319  0.999321 -0.866683 -0.558425   2.524155\nsaledate_year      110058.0 -0.000009  1.000016 -3.046831  0.328210   0.328210\ncar_age            110058.0  0.056580  1.081351 -1.547588 -0.449360   7.787354\nmake               110058.0 -0.035732  1.013148 -1.621862 -0.358624   2.088900\nmodel              110058.0 -0.031618  1.019517 -1.650798 -0.241758   1.988445\ntrim               110058.0  0.016039  1.003041 -2.155761  0.159408   1.689433\nbody               110058.0 -0.030069  1.020901 -3.274988  0.003214   1.970136\ntransmission       110058.0  0.030153  0.931506 -4.552826 -0.086400   4.380026\nstate              110058.0  0.002839  1.000547 -1.402561 -0.188613   1.805729\ncolor              110058.0 -0.006051  1.002316 -1.414614 -0.362985   1.439808\ninterior           110058.0  0.011184  1.011794 -0.937280 -0.700759   2.847060",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>count</th>\n      <th>mean</th>\n      <th>std</th>\n      <th>min</th>\n      <th>50%</th>\n      <th>max</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>year</th>\n      <td>110058.0</td>\n      <td>-0.056293</td>\n      <td>1.080258</td>\n      <td>-7.710482</td>\n      <td>0.472898</td>\n      <td>1.291236</td>\n    </tr>\n    <tr>\n      <th>condition</th>\n      <td>110058.0</td>\n      <td>-0.014312</td>\n      <td>1.021893</td>\n      <td>-1.984595</td>\n      <td>0.046558</td>\n      <td>2.077711</td>\n    </tr>\n    <tr>\n      <th>odometer</th>\n      <td>110058.0</td>\n      <td>0.051635</td>\n      <td>1.132653</td>\n      <td>-1.389090</td>\n      <td>-0.290001</td>\n      <td>19.775073</td>\n    </tr>\n    <tr>\n      <th>saledate_week_day</th>\n      <td>110058.0</td>\n      <td>-0.000198</td>\n      <td>0.999617</td>\n      <td>-2.051795</td>\n      <td>-0.136983</td>\n      <td>3.692641</td>\n    </tr>\n    <tr>\n      <th>saledate_month</th>\n      <td>110058.0</td>\n      <td>-0.000319</td>\n      <td>0.999321</td>\n      <td>-0.866683</td>\n      <td>-0.558425</td>\n      <td>2.524155</td>\n    </tr>\n    <tr>\n      <th>saledate_year</th>\n      <td>110058.0</td>\n      <td>-0.000009</td>\n      <td>1.000016</td>\n      <td>-3.046831</td>\n      <td>0.328210</td>\n      <td>0.328210</td>\n    </tr>\n    <tr>\n      <th>car_age</th>\n      <td>110058.0</td>\n      <td>0.056580</td>\n      <td>1.081351</td>\n      <td>-1.547588</td>\n      <td>-0.449360</td>\n      <td>7.787354</td>\n    </tr>\n    <tr>\n      <th>make</th>\n      <td>110058.0</td>\n      <td>-0.035732</td>\n      <td>1.013148</td>\n      <td>-1.621862</td>\n      <td>-0.358624</td>\n      <td>2.088900</td>\n    </tr>\n    <tr>\n      <th>model</th>\n      <td>110058.0</td>\n      <td>-0.031618</td>\n      <td>1.019517</td>\n      <td>-1.650798</td>\n      <td>-0.241758</td>\n      <td>1.988445</td>\n    </tr>\n    <tr>\n      <th>trim</th>\n      <td>110058.0</td>\n      <td>0.016039</td>\n      <td>1.003041</td>\n      <td>-2.155761</td>\n      <td>0.159408</td>\n      <td>1.689433</td>\n    </tr>\n    <tr>\n      <th>body</th>\n      <td>110058.0</td>\n      <td>-0.030069</td>\n      <td>1.020901</td>\n      <td>-3.274988</td>\n      <td>0.003214</td>\n      <td>1.970136</td>\n    </tr>\n    <tr>\n      <th>transmission</th>\n      <td>110058.0</td>\n      <td>0.030153</td>\n      <td>0.931506</td>\n      <td>-4.552826</td>\n      <td>-0.086400</td>\n      <td>4.380026</td>\n    </tr>\n    <tr>\n      <th>state</th>\n      <td>110058.0</td>\n      <td>0.002839</td>\n      <td>1.000547</td>\n      <td>-1.402561</td>\n      <td>-0.188613</td>\n      <td>1.805729</td>\n    </tr>\n    <tr>\n      <th>color</th>\n      <td>110058.0</td>\n      <td>-0.006051</td>\n      <td>1.002316</td>\n      <td>-1.414614</td>\n      <td>-0.362985</td>\n      <td>1.439808</td>\n    </tr>\n    <tr>\n      <th>interior</th>\n      <td>110058.0</td>\n      <td>0.011184</td>\n      <td>1.011794</td>\n      <td>-0.937280</td>\n      <td>-0.700759</td>\n      <td>2.847060</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Количество дублированных строк: 0\n"
     ]
    }
   ],
   "source": [
    "# Проводим скейлинг теста\n",
    "features_test_scaled = pd.DataFrame(\n",
    "    scaler.transform(features_test_encoded),\n",
    "    columns=features_test_encoded.columns,\n",
    "    index=features_test_encoded.index)\n",
    "describe_dataframe(features_test_scaled)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## Обучение линейных моделей <a name=\"chapter5.4\"></a>"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 209,
   "outputs": [
    {
     "data": {
      "text/plain": "[('year', 1698.6088039350423),\n ('condition', 1970.9439246501756),\n ('odometer', -2554.060771798476),\n ('saledate_week_day', 332.73353592872667),\n ('saledate_month', 133.477339913992),\n ('saledate_year', 226.74419267429613),\n ('car_age', -253.50106090976396),\n ('make', -563.5023917973422),\n ('model', 356.9311727714638),\n ('trim', -2.5640556578267137),\n ('body', -14.910505283811787),\n ('transmission', -234.12090540288708),\n ('state', -16.571488994692714),\n ('color', -188.25417530887617),\n ('interior', -85.10426776132988)]"
     },
     "execution_count": 209,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LinearRegression\n",
    "\n",
    "lin_regressor = LinearRegression()\n",
    "lin_regressor.fit(features_train_scaled, target_train)\n",
    "\n",
    "list(zip(features_train_scaled.columns, lin_regressor.coef_))"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 210,
   "outputs": [],
   "source": [
    "submission = lin_regressor.predict(features_test_scaled)\n",
    "sample_submission['sellingprice'] = submission\n",
    "sample_submission.to_csv('sample_submission.csv', index=False)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "Видно, что данные не сбалансированы и вес некоторых категорий критично выше других. Следует применить линейные модели сбалансировав классы.\n",
    "MAPE предсказаний данной модели = 67.87, что является плохим результатом."
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 211,
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\APMuravev\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\sklearn\\linear_model\\_coordinate_descent.py:631: ConvergenceWarning: Objective did not converge. You might want to increase the number of iterations, check the scale of the features or consider increasing regularisation. Duality gap: 5.934e+10, tolerance: 2.686e+09\n",
      "  model = cd_fast.enet_coordinate_descent(\n"
     ]
    },
    {
     "data": {
      "text/plain": "[('year', 3027.85649435814),\n ('condition', 1970.1925595627208),\n ('odometer', -2553.831936533952),\n ('saledate_week_day', 331.87158939738003),\n ('saledate_month', 127.56644320921284),\n ('saledate_year', 113.89957139087156),\n ('car_age', 1065.3544374803616),\n ('make', -562.2719243528785),\n ('model', 355.51633238393157),\n ('trim', -1.5249901704266196),\n ('body', -13.68894197758514),\n ('transmission', -232.83425450213466),\n ('state', -15.463751712850652),\n ('color', -187.34702069774573),\n ('interior', -84.06511673666151)]"
     },
     "execution_count": 211,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import Lasso\n",
    "\n",
    "lasso_regressor = Lasso()\n",
    "lasso_regressor.fit(features_train_scaled, target_train)\n",
    "\n",
    "list(zip(features_train_scaled.columns, lasso_regressor.coef_))"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 212,
   "outputs": [],
   "source": [
    "submission = lasso_regressor.predict(features_test_scaled)\n",
    "sample_submission['sellingprice'] = submission\n",
    "sample_submission.to_csv('sample_submission.csv', index=False)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "После регуляризации результат не сильно изменился.\n",
    "MAPE предсказаний данной модели = 67.87, что не отличается от предыдущей модели.\n",
    "Следовательно, стоит обучить более тяжелую модель для более точных предсказаний."
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## Обучение модели случайного леса <a name=\"chapter5.5\"></a>"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 213,
   "outputs": [],
   "source": [
    "# Для одинакового результата создадим фолды для трейна\n",
    "kf = KFold(n_splits=3, random_state=32123, shuffle=True)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 214,
   "outputs": [],
   "source": [
    "# Определим сетку параметров для поиска оптимальной комбинации\n",
    "param_grid = {\n",
    "    'n_estimators': [100, 200, 500],\n",
    "    'max_features': ['auto', 'sqrt', 'log2'],\n",
    "    'max_depth' : [5, 10, 15, 20],\n",
    "    'min_samples_split' : [2, 5, 10],\n",
    "    'min_samples_leaf' : [1, 2, 4]\n",
    "}"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 215,
   "outputs": [],
   "source": [
    "pipeline = make_pipeline(\n",
    "    OrdinalEncoder(handle_unknown='use_encoded_value', unknown_value=-1),\n",
    "    StandardScaler(),\n",
    "    RandomForestRegressor())"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 216,
   "outputs": [],
   "source": [
    "# найдём параметры для оптимальной модели случайного леса\n",
    "from sklearn.model_selection import RandomizedSearchCV\n",
    "\n",
    "rf_params = {'randomforestregressor__' + key: param_grid[key] for key in param_grid}\n",
    "grid_rf = RandomizedSearchCV(\n",
    "    pipeline, # RandomForestRegressor()\n",
    "    param_distributions=rf_params,\n",
    "    cv=kf,\n",
    "    n_iter=15,\n",
    "    scoring='neg_mean_absolute_percentage_error',\n",
    "    n_jobs=2,\n",
    "    return_train_score=True)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 217,
   "outputs": [
    {
     "data": {
      "text/plain": "{'randomforestregressor__n_estimators': 500,\n 'randomforestregressor__min_samples_split': 2,\n 'randomforestregressor__min_samples_leaf': 4,\n 'randomforestregressor__max_features': 'sqrt',\n 'randomforestregressor__max_depth': 20}"
     },
     "execution_count": 217,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Обучаем сетки и выводим наилучшие параметры\n",
    "grid_rf.fit(features_train, target_train)\n",
    "grid_rf.best_params_"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 218,
   "outputs": [
    {
     "data": {
      "text/plain": "-0.3909180588263725"
     },
     "execution_count": 218,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Наилучшая оценка\n",
    "grid_rf.best_score_"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "Получаем ожидаемую оценку в полтора раза лучше, чем при обучении линейной модели."
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 225,
   "outputs": [],
   "source": [
    "# Обучаем оптиальную модель\n",
    "model = RandomForestRegressor(\n",
    "    n_estimators=500,\n",
    "    min_samples_split=2,\n",
    "    min_samples_leaf=4,\n",
    "    max_features='sqrt',\n",
    "    max_depth=20)\n",
    "# model.fit(features_train, target_train)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 226,
   "outputs": [],
   "source": [
    "rf_pipeline = make_pipeline(\n",
    "    OrdinalEncoder(handle_unknown='use_encoded_value', unknown_value=-1),\n",
    "    StandardScaler(),\n",
    "    model)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 227,
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\APMuravev\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\sklearn\\ensemble\\_forest.py:413: FutureWarning: `max_features='auto'` has been deprecated in 1.1 and will be removed in 1.3. To keep the past behaviour, explicitly set `max_features=1.0` or remove this parameter as it is also the default value for RandomForestRegressors and ExtraTreesRegressors.\n",
      "  warn(\n"
     ]
    },
    {
     "data": {
      "text/plain": "Pipeline(steps=[('ordinalencoder',\n                 OrdinalEncoder(handle_unknown='use_encoded_value',\n                                unknown_value=-1)),\n                ('standardscaler', StandardScaler()),\n                ('randomforestregressor',\n                 RandomForestRegressor(max_depth=20, max_features='auto',\n                                       min_samples_split=5,\n                                       n_estimators=200))])",
      "text/html": "<style>#sk-container-id-8 {color: black;background-color: white;}#sk-container-id-8 pre{padding: 0;}#sk-container-id-8 div.sk-toggleable {background-color: white;}#sk-container-id-8 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-8 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-8 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-8 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-8 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-8 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-8 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-8 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-8 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-8 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-8 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-8 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-8 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-8 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-8 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-8 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-8 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-8 div.sk-item {position: relative;z-index: 1;}#sk-container-id-8 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-8 div.sk-item::before, #sk-container-id-8 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-8 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-8 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-8 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-8 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-8 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-8 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-8 div.sk-label-container {text-align: center;}#sk-container-id-8 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-8 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-8\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>Pipeline(steps=[(&#x27;ordinalencoder&#x27;,\n                 OrdinalEncoder(handle_unknown=&#x27;use_encoded_value&#x27;,\n                                unknown_value=-1)),\n                (&#x27;standardscaler&#x27;, StandardScaler()),\n                (&#x27;randomforestregressor&#x27;,\n                 RandomForestRegressor(max_depth=20, max_features=&#x27;auto&#x27;,\n                                       min_samples_split=5,\n                                       n_estimators=200))])</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-17\" type=\"checkbox\" ><label for=\"sk-estimator-id-17\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">Pipeline</label><div class=\"sk-toggleable__content\"><pre>Pipeline(steps=[(&#x27;ordinalencoder&#x27;,\n                 OrdinalEncoder(handle_unknown=&#x27;use_encoded_value&#x27;,\n                                unknown_value=-1)),\n                (&#x27;standardscaler&#x27;, StandardScaler()),\n                (&#x27;randomforestregressor&#x27;,\n                 RandomForestRegressor(max_depth=20, max_features=&#x27;auto&#x27;,\n                                       min_samples_split=5,\n                                       n_estimators=200))])</pre></div></div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-18\" type=\"checkbox\" ><label for=\"sk-estimator-id-18\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">OrdinalEncoder</label><div class=\"sk-toggleable__content\"><pre>OrdinalEncoder(handle_unknown=&#x27;use_encoded_value&#x27;, unknown_value=-1)</pre></div></div></div><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-19\" type=\"checkbox\" ><label for=\"sk-estimator-id-19\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">StandardScaler</label><div class=\"sk-toggleable__content\"><pre>StandardScaler()</pre></div></div></div><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-20\" type=\"checkbox\" ><label for=\"sk-estimator-id-20\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">RandomForestRegressor</label><div class=\"sk-toggleable__content\"><pre>RandomForestRegressor(max_depth=20, max_features=&#x27;auto&#x27;, min_samples_split=5,\n                      n_estimators=200)</pre></div></div></div></div></div></div></div>"
     },
     "execution_count": 227,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rf_pipeline.fit(features_train, target_train)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 228,
   "outputs": [
    {
     "data": {
      "text/plain": "array([ 3460.1900058 , 22318.59177325, 17901.64329955, ...,\n        3409.16569242, 18529.15714286, 16459.30823797])"
     },
     "execution_count": 228,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Находим предсказание\n",
    "submission = rf_pipeline.predict(features_test)\n",
    "submission"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 229,
   "outputs": [],
   "source": [
    "# Заполняем sample_submission\n",
    "sample_submission['sellingprice'] = submission\n",
    "sample_submission.to_csv('sample_submission.csv', index=False)"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "# Выводы <a name=\"chapter6\"></a>"
   ],
   "metadata": {
    "collapsed": false
   },
   "execution_count": 1
  },
  {
   "cell_type": "markdown",
   "source": [
    "Выводы:\n",
    "В рамках данной задачи необходимо поработать с данными о продажах автомобилей на вторичном рынке. В данном проекте была разработана модель предсказания стоимости автомобиля на вторичном рынке.\n",
    "При знакомстве с данными были выявлены следующие особенности: В данных большое количество выбросов, пропущенных значений, неявных дубликатов в колонках с марками и моделями авто.\n",
    "В итоге предобработки данных были устранены все пропущенные значения, явные выбросы и форматы некоторых колонок. Итоговая потеря данных составила около 7%.\n",
    "Далее были добавлены 4 синтетических столбца - год, месяц и день недели продажи авто. Также полный возраст авто, устранены аномалии в возрасте авто. Доказана мультиколлинеарность данных.\n",
    "Данные были кодированы, проведём скейлинг, почле чего с помощью RandomizedSearchCV были подобраны оптимальные параметры модели с MAPE = 16% (Итоговая MAPE на тестовых данных = 23%). Модель имела следующие параметры:\n",
    "<code>RandomForestRegressor(\n",
    "    n_estimators=200,\n",
    "    min_samples_split=5,\n",
    "    min_samples_leaf=1,\n",
    "    max_features='auto',\n",
    "    max_depth=20)</code>\n"
   ],
   "metadata": {
    "collapsed": false
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
